github.com/dcarley/cf-cli@v6.24.1-0.20170220111324-4225ff346898+incompatible/cf/commands/service/purge_service_offering_test.go (about) 1 package service_test 2 3 import ( 4 "code.cloudfoundry.org/cli/cf/commandregistry" 5 "code.cloudfoundry.org/cli/cf/commands/service" 6 "code.cloudfoundry.org/cli/cf/configuration/coreconfig" 7 "code.cloudfoundry.org/cli/cf/errors" 8 "code.cloudfoundry.org/cli/cf/flags" 9 "code.cloudfoundry.org/cli/cf/models" 10 "code.cloudfoundry.org/cli/cf/requirements" 11 "code.cloudfoundry.org/cli/cf/requirements/requirementsfakes" 12 13 "code.cloudfoundry.org/cli/cf/api/apifakes" 14 testconfig "code.cloudfoundry.org/cli/util/testhelpers/configuration" 15 testterm "code.cloudfoundry.org/cli/util/testhelpers/terminal" 16 17 . "code.cloudfoundry.org/cli/util/testhelpers/matchers" 18 . "github.com/onsi/ginkgo" 19 . "github.com/onsi/gomega" 20 ) 21 22 var _ = Describe("PurgeServiceOffering", func() { 23 var ( 24 ui *testterm.FakeUI 25 configRepo coreconfig.Repository 26 serviceRepo *apifakes.FakeServiceRepository 27 28 cmd commandregistry.Command 29 deps commandregistry.Dependency 30 factory *requirementsfakes.FakeFactory 31 flagContext flags.FlagContext 32 33 loginRequirement requirements.Requirement 34 maxAPIVersionRequirement requirements.Requirement 35 ) 36 37 BeforeEach(func() { 38 ui = &testterm.FakeUI{} 39 configRepo = testconfig.NewRepositoryWithDefaults() 40 serviceRepo = new(apifakes.FakeServiceRepository) 41 repoLocator := deps.RepoLocator.SetServiceRepository(serviceRepo) 42 43 deps = commandregistry.Dependency{ 44 UI: ui, 45 Config: configRepo, 46 RepoLocator: repoLocator, 47 } 48 49 cmd = &service.PurgeServiceOffering{} 50 cmd.SetDependency(deps, false) 51 52 flagContext = flags.NewFlagContext(cmd.MetaData().Flags) 53 factory = new(requirementsfakes.FakeFactory) 54 55 loginRequirement = &passingRequirement{Name: "login-requirement"} 56 factory.NewLoginRequirementReturns(loginRequirement) 57 58 maxAPIVersionRequirement = &passingRequirement{Name: "max-api-version-requirement"} 59 factory.NewMaxAPIVersionRequirementReturns(maxAPIVersionRequirement) 60 }) 61 62 Describe("Requirements", func() { 63 Context("when not provided exactly one arg", func() { 64 BeforeEach(func() { 65 flagContext.Parse("service", "extra-arg") 66 }) 67 68 It("fails with usage", func() { 69 _, err := cmd.Requirements(factory, flagContext) 70 Expect(err).To(HaveOccurred()) 71 Expect(ui.Outputs()).To(ContainSubstrings( 72 []string{"FAILED"}, 73 []string{"Incorrect Usage. Requires an argument"}, 74 )) 75 }) 76 }) 77 78 Context("when provided exactly one arg", func() { 79 BeforeEach(func() { 80 flagContext.Parse("service") 81 }) 82 83 It("returns a LoginRequirement", func() { 84 actualRequirements, err := cmd.Requirements(factory, flagContext) 85 Expect(err).NotTo(HaveOccurred()) 86 Expect(factory.NewLoginRequirementCallCount()).To(Equal(1)) 87 Expect(actualRequirements).To(ContainElement(loginRequirement)) 88 }) 89 }) 90 91 Context("when the -p flag is passed", func() { 92 BeforeEach(func() { 93 flagContext.Parse("service", "-p", "provider-name") 94 }) 95 96 It("returns a MaxAPIVersion requirement", func() { 97 actualRequirements, err := cmd.Requirements(factory, flagContext) 98 Expect(err).NotTo(HaveOccurred()) 99 Expect(actualRequirements).To(ContainElement(maxAPIVersionRequirement)) 100 }) 101 }) 102 }) 103 104 Describe("Execute", func() { 105 var runCLIErr error 106 107 BeforeEach(func() { 108 err := flagContext.Parse("service-name") 109 Expect(err).NotTo(HaveOccurred()) 110 _, err = cmd.Requirements(factory, flagContext) 111 Expect(err).NotTo(HaveOccurred()) 112 ui.Inputs = []string{"n"} 113 serviceRepo.FindServiceOfferingsByLabelReturns([]models.ServiceOffering{{}}, nil) 114 }) 115 116 JustBeforeEach(func() { 117 runCLIErr = cmd.Execute(flagContext) 118 }) 119 120 It("tries to find the service offering by label", func() { 121 Expect(runCLIErr).NotTo(HaveOccurred()) 122 Expect(serviceRepo.FindServiceOfferingsByLabelCallCount()).To(Equal(1)) 123 name := serviceRepo.FindServiceOfferingsByLabelArgsForCall(0) 124 Expect(name).To(Equal("service-name")) 125 }) 126 127 Context("when finding the service offering succeeds", func() { 128 BeforeEach(func() { 129 serviceOffering := models.ServiceOffering{} 130 serviceOffering.GUID = "service-offering-guid" 131 serviceRepo.FindServiceOfferingsByLabelReturns([]models.ServiceOffering{serviceOffering}, nil) 132 ui.Inputs = []string{"n"} 133 }) 134 135 It("asks the user to confirm", func() { 136 Expect(runCLIErr).NotTo(HaveOccurred()) 137 Expect(ui.Outputs()).To(ContainSubstrings([]string{"WARNING"})) 138 Expect(ui.Prompts).To(ContainSubstrings([]string{"Really purge service offering service-name from Cloud Foundry?"})) 139 }) 140 141 Context("when the user confirms", func() { 142 BeforeEach(func() { 143 ui.Inputs = []string{"y"} 144 }) 145 146 It("tells the user it will purge the service offering", func() { 147 Expect(runCLIErr).NotTo(HaveOccurred()) 148 Expect(ui.Outputs()).To(ContainSubstrings([]string{"Purging service service-name..."})) 149 }) 150 151 It("tries to purge the service offering", func() { 152 Expect(runCLIErr).NotTo(HaveOccurred()) 153 Expect(serviceRepo.PurgeServiceOfferingCallCount()).To(Equal(1)) 154 }) 155 156 Context("when purging succeeds", func() { 157 BeforeEach(func() { 158 serviceRepo.PurgeServiceOfferingReturns(nil) 159 }) 160 161 It("says OK", func() { 162 Expect(runCLIErr).NotTo(HaveOccurred()) 163 Expect(ui.Outputs()).To(ContainSubstrings([]string{"OK"})) 164 }) 165 }) 166 167 Context("when purging fails", func() { 168 BeforeEach(func() { 169 serviceRepo.PurgeServiceOfferingReturns(errors.New("purge-err")) 170 }) 171 172 It("fails with error", func() { 173 Expect(runCLIErr).To(HaveOccurred()) 174 Expect(runCLIErr.Error()).To(Equal("purge-err")) 175 }) 176 }) 177 }) 178 179 Context("when the user does not confirm", func() { 180 BeforeEach(func() { 181 ui.Inputs = []string{"n"} 182 }) 183 184 It("does not try to purge the service offering", func() { 185 Expect(runCLIErr).NotTo(HaveOccurred()) 186 Expect(serviceRepo.PurgeServiceOfferingCallCount()).To(BeZero()) 187 }) 188 }) 189 }) 190 191 Context("when finding the service offering fails with an error other than 404", func() { 192 BeforeEach(func() { 193 serviceRepo.FindServiceOfferingsByLabelReturns([]models.ServiceOffering{}, errors.New("find-err")) 194 }) 195 196 It("fails with error", func() { 197 Expect(runCLIErr).To(HaveOccurred()) 198 Expect(runCLIErr.Error()).To(Equal("find-err")) 199 }) 200 }) 201 202 Context("when finding the service offering fails with 404 not found", func() { 203 BeforeEach(func() { 204 serviceRepo.FindServiceOfferingsByLabelReturns( 205 []models.ServiceOffering{{}}, 206 errors.NewModelNotFoundError("model-type", "find-err"), 207 ) 208 }) 209 210 It("warns the user", func() { 211 Expect(runCLIErr).NotTo(HaveOccurred()) 212 Expect(ui.Outputs()).To(ContainSubstrings( 213 []string{"Service offering does not exist"}, 214 )) 215 }) 216 217 It("does not try to purge the service offering", func() { 218 Expect(runCLIErr).NotTo(HaveOccurred()) 219 Expect(serviceRepo.PurgeServiceOfferingCallCount()).To(BeZero()) 220 }) 221 }) 222 223 Context("when the -p flag is passed", func() { 224 var origAPIVersion string 225 226 BeforeEach(func() { 227 origAPIVersion = configRepo.APIVersion() 228 configRepo.SetAPIVersion("2.46.0") 229 230 flagContext = flags.NewFlagContext(cmd.MetaData().Flags) 231 err := flagContext.Parse("service-name", "-p", "provider-name") 232 Expect(err).NotTo(HaveOccurred()) 233 cmd.Requirements(factory, flagContext) 234 ui.Inputs = []string{"n"} 235 }) 236 237 AfterEach(func() { 238 configRepo.SetAPIVersion(origAPIVersion) 239 }) 240 241 It("tries to find the service offering by label and provider", func() { 242 Expect(runCLIErr).NotTo(HaveOccurred()) 243 Expect(serviceRepo.FindServiceOfferingByLabelAndProviderCallCount()).To(Equal(1)) 244 name, provider := serviceRepo.FindServiceOfferingByLabelAndProviderArgsForCall(0) 245 Expect(name).To(Equal("service-name")) 246 Expect(provider).To(Equal("provider-name")) 247 }) 248 249 Context("when finding the service offering succeeds", func() { 250 BeforeEach(func() { 251 serviceOffering := models.ServiceOffering{} 252 serviceOffering.GUID = "service-offering-guid" 253 serviceRepo.FindServiceOfferingByLabelAndProviderReturns(serviceOffering, nil) 254 ui.Inputs = []string{"n"} 255 }) 256 257 It("asks the user to confirm", func() { 258 Expect(runCLIErr).NotTo(HaveOccurred()) 259 Expect(ui.Outputs()).To(ContainSubstrings([]string{"WARNING"})) 260 Expect(ui.Prompts).To(ContainSubstrings([]string{"Really purge service offering service-name from Cloud Foundry?"})) 261 }) 262 263 Context("when the user confirms", func() { 264 BeforeEach(func() { 265 ui.Inputs = []string{"y"} 266 }) 267 268 It("tells the user it will purge the service offering", func() { 269 Expect(runCLIErr).NotTo(HaveOccurred()) 270 Expect(ui.Outputs()).To(ContainSubstrings([]string{"Purging service service-name..."})) 271 }) 272 273 It("tries to purge the service offering", func() { 274 Expect(runCLIErr).NotTo(HaveOccurred()) 275 Expect(serviceRepo.PurgeServiceOfferingCallCount()).To(Equal(1)) 276 }) 277 278 Context("when purging succeeds", func() { 279 BeforeEach(func() { 280 serviceRepo.PurgeServiceOfferingReturns(nil) 281 }) 282 283 It("says OK", func() { 284 Expect(runCLIErr).NotTo(HaveOccurred()) 285 Expect(ui.Outputs()).To(ContainSubstrings([]string{"OK"})) 286 }) 287 }) 288 289 Context("when purging fails", func() { 290 BeforeEach(func() { 291 serviceRepo.PurgeServiceOfferingReturns(errors.New("purge-err")) 292 }) 293 294 It("fails with error", func() { 295 Expect(runCLIErr).To(HaveOccurred()) 296 Expect(runCLIErr.Error()).To(Equal("purge-err")) 297 }) 298 }) 299 }) 300 301 Context("when the user does not confirm", func() { 302 BeforeEach(func() { 303 ui.Inputs = []string{"n"} 304 }) 305 306 It("does not try to purge the service offering", func() { 307 Expect(runCLIErr).NotTo(HaveOccurred()) 308 Expect(serviceRepo.PurgeServiceOfferingCallCount()).To(BeZero()) 309 }) 310 }) 311 }) 312 313 Context("when finding the service offering fails with an error other than 404", func() { 314 BeforeEach(func() { 315 serviceRepo.FindServiceOfferingByLabelAndProviderReturns(models.ServiceOffering{}, errors.New("find-err")) 316 }) 317 318 It("fails with error", func() { 319 Expect(runCLIErr).To(HaveOccurred()) 320 Expect(runCLIErr.Error()).To(Equal("find-err")) 321 }) 322 }) 323 324 Context("when finding the service offering fails with 404 not found", func() { 325 BeforeEach(func() { 326 serviceRepo.FindServiceOfferingByLabelAndProviderReturns( 327 models.ServiceOffering{}, 328 errors.NewModelNotFoundError("model-type", "find-err"), 329 ) 330 }) 331 332 It("warns the user", func() { 333 Expect(runCLIErr).NotTo(HaveOccurred()) 334 Expect(ui.Outputs()).To(ContainSubstrings( 335 []string{"Service offering does not exist"}, 336 )) 337 }) 338 339 It("does not try to purge the service offering", func() { 340 Expect(runCLIErr).NotTo(HaveOccurred()) 341 Expect(serviceRepo.PurgeServiceOfferingCallCount()).To(BeZero()) 342 }) 343 }) 344 }) 345 }) 346 })