github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/cf/commands/service/purge_service_instance_test.go (about) 1 package service_test 2 3 import ( 4 "errors" 5 6 "github.com/blang/semver" 7 "github.com/liamawhite/cli-with-i18n/cf/commandregistry" 8 "github.com/liamawhite/cli-with-i18n/cf/commands/service" 9 "github.com/liamawhite/cli-with-i18n/cf/configuration/coreconfig" 10 cferrors "github.com/liamawhite/cli-with-i18n/cf/errors" 11 "github.com/liamawhite/cli-with-i18n/cf/flags" 12 "github.com/liamawhite/cli-with-i18n/cf/models" 13 "github.com/liamawhite/cli-with-i18n/cf/requirements" 14 "github.com/liamawhite/cli-with-i18n/cf/requirements/requirementsfakes" 15 16 "github.com/liamawhite/cli-with-i18n/cf/api/apifakes" 17 18 testconfig "github.com/liamawhite/cli-with-i18n/util/testhelpers/configuration" 19 testterm "github.com/liamawhite/cli-with-i18n/util/testhelpers/terminal" 20 21 . "github.com/liamawhite/cli-with-i18n/util/testhelpers/matchers" 22 23 . "github.com/onsi/ginkgo" 24 . "github.com/onsi/gomega" 25 ) 26 27 var _ = Describe("PurgeServiceInstance", func() { 28 var ( 29 ui *testterm.FakeUI 30 configRepo coreconfig.Repository 31 serviceRepo *apifakes.FakeServiceRepository 32 33 cmd commandregistry.Command 34 deps commandregistry.Dependency 35 factory *requirementsfakes.FakeFactory 36 flagContext flags.FlagContext 37 38 loginRequirement requirements.Requirement 39 minAPIVersionRequirement requirements.Requirement 40 ) 41 42 BeforeEach(func() { 43 ui = &testterm.FakeUI{} 44 configRepo = testconfig.NewRepositoryWithDefaults() 45 serviceRepo = new(apifakes.FakeServiceRepository) 46 repoLocator := deps.RepoLocator.SetServiceRepository(serviceRepo) 47 48 deps = commandregistry.Dependency{ 49 UI: ui, 50 Config: configRepo, 51 RepoLocator: repoLocator, 52 } 53 54 cmd = &service.PurgeServiceInstance{} 55 cmd.SetDependency(deps, false) 56 57 flagContext = flags.NewFlagContext(cmd.MetaData().Flags) 58 59 factory = new(requirementsfakes.FakeFactory) 60 61 loginRequirement = &passingRequirement{} 62 factory.NewLoginRequirementReturns(loginRequirement) 63 64 minAPIVersionRequirement = &passingRequirement{} 65 factory.NewMinAPIVersionRequirementReturns(minAPIVersionRequirement) 66 }) 67 68 Describe("Requirements", func() { 69 Context("when not provided exactly one arg", func() { 70 BeforeEach(func() { 71 flagContext.Parse("service-instance", "extra-arg") 72 }) 73 74 It("fails with usage", func() { 75 _, err := cmd.Requirements(factory, flagContext) 76 Expect(err).To(HaveOccurred()) 77 Expect(ui.Outputs()).To(ContainSubstrings( 78 []string{"Incorrect Usage. Requires an argument"}, 79 []string{"NAME"}, 80 []string{"USAGE"}, 81 )) 82 }) 83 }) 84 85 Context("when provided exactly one arg", func() { 86 BeforeEach(func() { 87 flagContext.Parse("service-instance") 88 }) 89 90 It("returns a LoginRequirement", func() { 91 actualRequirements, err := cmd.Requirements(factory, flagContext) 92 Expect(err).NotTo(HaveOccurred()) 93 Expect(factory.NewLoginRequirementCallCount()).To(Equal(1)) 94 95 Expect(actualRequirements).To(ContainElement(loginRequirement)) 96 }) 97 98 It("returns a MinAPIVersionRequirement", func() { 99 actualRequirements, err := cmd.Requirements(factory, flagContext) 100 Expect(err).NotTo(HaveOccurred()) 101 Expect(factory.NewMinAPIVersionRequirementCallCount()).To(Equal(1)) 102 103 expectedVersion, err := semver.Make("2.36.0") 104 Expect(err).NotTo(HaveOccurred()) 105 106 commandName, requiredVersion := factory.NewMinAPIVersionRequirementArgsForCall(0) 107 Expect(commandName).To(Equal("purge-service-instance")) 108 Expect(requiredVersion).To(Equal(expectedVersion)) 109 110 Expect(actualRequirements).To(ContainElement(minAPIVersionRequirement)) 111 }) 112 }) 113 }) 114 115 Describe("Execute", func() { 116 BeforeEach(func() { 117 err := flagContext.Parse("service-instance-name") 118 Expect(err).NotTo(HaveOccurred()) 119 cmd.Requirements(factory, flagContext) 120 }) 121 122 It("finds the instance by name in the service repo", func() { 123 err := flagContext.Parse("service-instance-name", "-f") 124 Expect(err).NotTo(HaveOccurred()) 125 cmd.Execute(flagContext) 126 Expect(serviceRepo.FindInstanceByNameCallCount()).To(Equal(1)) 127 }) 128 129 Context("when the instance can be found", func() { 130 var serviceInstance models.ServiceInstance 131 132 BeforeEach(func() { 133 serviceInstance = models.ServiceInstance{} 134 serviceInstance.Name = "service-instance-name" 135 serviceRepo.FindInstanceByNameReturns(serviceInstance, nil) 136 }) 137 138 It("warns the user", func() { 139 ui.Inputs = []string{"n"} 140 cmd.Execute(flagContext) 141 Eventually(func() []string { 142 return ui.Outputs() 143 }).Should(ContainSubstrings( 144 []string{"WARNING"}, 145 )) 146 }) 147 148 It("asks the user if they would like to proceed", func() { 149 ui.Inputs = []string{"n"} 150 cmd.Execute(flagContext) 151 Eventually(func() []string { return ui.Prompts }).Should(ContainSubstrings( 152 []string{"Really purge service instance service-instance-name from Cloud Foundry?"}, 153 )) 154 }) 155 156 It("purges the service instance when the response is to proceed", func() { 157 ui.Inputs = []string{"y"} 158 cmd.Execute(flagContext) 159 160 Eventually(serviceRepo.PurgeServiceInstanceCallCount).Should(Equal(1)) 161 Expect(serviceRepo.PurgeServiceInstanceArgsForCall(0)).To(Equal(serviceInstance)) 162 }) 163 164 It("does not purge the service instance when the response is not to proceed", func() { 165 ui.Inputs = []string{"n"} 166 cmd.Execute(flagContext) 167 Consistently(serviceRepo.PurgeServiceInstanceCallCount).Should(BeZero()) 168 }) 169 170 Context("when force is set", func() { 171 BeforeEach(func() { 172 err := flagContext.Parse("service-instance-name", "-f") 173 Expect(err).NotTo(HaveOccurred()) 174 }) 175 176 It("does not ask the user if they would like to proceed", func() { 177 Expect(ui.Prompts).NotTo(ContainSubstrings( 178 []string{"Really purge service instance service-instance-name from Cloud Foundry?"}, 179 )) 180 }) 181 182 It("purges the service instance", func() { 183 cmd.Execute(flagContext) 184 Expect(serviceRepo.PurgeServiceInstanceCallCount()).To(Equal(1)) 185 Expect(serviceRepo.PurgeServiceInstanceArgsForCall(0)).To(Equal(serviceInstance)) 186 }) 187 }) 188 }) 189 190 Context("when the instance can not be found", func() { 191 BeforeEach(func() { 192 serviceRepo.FindInstanceByNameReturns(models.ServiceInstance{}, cferrors.NewModelNotFoundError("model-type", "model-name")) 193 }) 194 195 It("prints a warning", func() { 196 cmd.Execute(flagContext) 197 Expect(ui.Outputs()).To(ContainSubstrings( 198 []string{"Service instance service-instance-name not found"}, 199 )) 200 }) 201 }) 202 203 Context("when an error occurs fetching the instance", func() { 204 var runCLIErr error 205 206 BeforeEach(func() { 207 serviceRepo.FindInstanceByNameReturns(models.ServiceInstance{}, errors.New("an-error")) 208 }) 209 210 JustBeforeEach(func() { 211 runCLIErr = cmd.Execute(flagContext) 212 }) 213 214 It("prints a message with the error", func() { 215 Expect(runCLIErr).To(HaveOccurred()) 216 }) 217 }) 218 }) 219 })