github.com/ablease/cli@v6.37.1-0.20180613014814-3adbb7d7fb19+incompatible/cf/commands/service/create_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/requirements" 13 "code.cloudfoundry.org/cli/cf/requirements/requirementsfakes" 14 "github.com/blang/semver" 15 16 "code.cloudfoundry.org/cli/cf/api/apifakes" 17 testconfig "code.cloudfoundry.org/cli/cf/util/testhelpers/configuration" 18 testterm "code.cloudfoundry.org/cli/cf/util/testhelpers/terminal" 19 20 . "code.cloudfoundry.org/cli/cf/util/testhelpers/matchers" 21 . "github.com/onsi/ginkgo" 22 . "github.com/onsi/gomega" 23 ) 24 25 var _ = Describe("CreateUserProvidedService", func() { 26 var ( 27 ui *testterm.FakeUI 28 configRepo coreconfig.Repository 29 serviceInstanceRepo *apifakes.FakeUserProvidedServiceInstanceRepository 30 31 cmd commandregistry.Command 32 deps commandregistry.Dependency 33 factory *requirementsfakes.FakeFactory 34 flagContext flags.FlagContext 35 36 loginRequirement requirements.Requirement 37 targetedSpaceRequirement requirements.Requirement 38 minAPIVersionRequirement requirements.Requirement 39 ) 40 41 BeforeEach(func() { 42 ui = new(testterm.FakeUI) 43 configRepo = testconfig.NewRepositoryWithDefaults() 44 serviceInstanceRepo = new(apifakes.FakeUserProvidedServiceInstanceRepository) 45 repoLocator := deps.RepoLocator.SetUserProvidedServiceInstanceRepository(serviceInstanceRepo) 46 47 deps = commandregistry.Dependency{ 48 UI: ui, 49 Config: configRepo, 50 RepoLocator: repoLocator, 51 } 52 53 cmd = &service.CreateUserProvidedService{} 54 cmd.SetDependency(deps, false) 55 56 flagContext = flags.NewFlagContext(cmd.MetaData().Flags) 57 factory = new(requirementsfakes.FakeFactory) 58 59 loginRequirement = &passingRequirement{Name: "login-requirement"} 60 factory.NewLoginRequirementReturns(loginRequirement) 61 62 minAPIVersionRequirement = &passingRequirement{Name: "min-api-version-requirement"} 63 factory.NewMinAPIVersionRequirementReturns(minAPIVersionRequirement) 64 65 targetedSpaceRequirement = &passingRequirement{Name: "targeted-space-requirement"} 66 factory.NewTargetedSpaceRequirementReturns(targetedSpaceRequirement) 67 }) 68 69 Describe("Requirements", func() { 70 Context("when not provided exactly one arg", func() { 71 BeforeEach(func() { 72 flagContext.Parse("service-instance", "extra-arg") 73 }) 74 75 It("fails with usage", func() { 76 _, err := cmd.Requirements(factory, flagContext) 77 Expect(err).To(HaveOccurred()) 78 Expect(ui.Outputs()).To(ContainSubstrings( 79 []string{"FAILED"}, 80 []string{"Incorrect Usage. Requires an argument"}, 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 Expect(actualRequirements).To(ContainElement(loginRequirement)) 95 }) 96 97 It("returns a TargetedSpaceRequirement", func() { 98 actualRequirements, err := cmd.Requirements(factory, flagContext) 99 Expect(err).NotTo(HaveOccurred()) 100 Expect(factory.NewTargetedSpaceRequirementCallCount()).To(Equal(1)) 101 Expect(actualRequirements).To(ContainElement(targetedSpaceRequirement)) 102 }) 103 }) 104 105 Context("when provided the -r flag", func() { 106 BeforeEach(func() { 107 flagContext.Parse("service-instance", "-r", "route-service-url") 108 }) 109 110 It("returns a MinAPIVersionRequirement", func() { 111 actualRequirements, err := cmd.Requirements(factory, flagContext) 112 Expect(err).NotTo(HaveOccurred()) 113 Expect(factory.NewMinAPIVersionRequirementCallCount()).To(Equal(1)) 114 Expect(actualRequirements).To(ContainElement(minAPIVersionRequirement)) 115 116 feature, requiredVersion := factory.NewMinAPIVersionRequirementArgsForCall(0) 117 Expect(feature).To(Equal("Option '-r'")) 118 expectedRequiredVersion, err := semver.Make("2.51.0") 119 Expect(err).NotTo(HaveOccurred()) 120 Expect(requiredVersion).To(Equal(expectedRequiredVersion)) 121 }) 122 }) 123 124 Context("when provided the -t flag", func() { 125 BeforeEach(func() { 126 flagContext.Parse("service-instance", "-t", "tag,a,service") 127 }) 128 129 It("returns a MinAPIVersionRequirement", func() { 130 actualRequirements, err := cmd.Requirements(factory, flagContext) 131 Expect(err).NotTo(HaveOccurred()) 132 Expect(factory.NewMinAPIVersionRequirementCallCount()).To(Equal(1)) 133 Expect(actualRequirements).To(ContainElement(minAPIVersionRequirement)) 134 135 feature, requiredVersion := factory.NewMinAPIVersionRequirementArgsForCall(0) 136 Expect(feature).To(Equal("Option '-t'")) 137 expectedRequiredVersion, err := semver.Make("2.104.0") 138 Expect(err).NotTo(HaveOccurred()) 139 Expect(requiredVersion).To(Equal(expectedRequiredVersion)) 140 }) 141 }) 142 }) 143 144 Describe("Execute", func() { 145 var runCLIErr error 146 147 BeforeEach(func() { 148 err := flagContext.Parse("service-instance") 149 Expect(err).NotTo(HaveOccurred()) 150 cmd.Requirements(factory, flagContext) 151 }) 152 153 JustBeforeEach(func() { 154 runCLIErr = cmd.Execute(flagContext) 155 }) 156 157 It("tells the user it will create the user provided service", func() { 158 Expect(runCLIErr).NotTo(HaveOccurred()) 159 Expect(ui.Outputs()).To(ContainSubstrings( 160 []string{"Creating user provided service service-instance in org"}, 161 )) 162 }) 163 164 It("tries to create the user provided service instance", func() { 165 Expect(runCLIErr).NotTo(HaveOccurred()) 166 Expect(serviceInstanceRepo.CreateCallCount()).To(Equal(1)) 167 name, drainURL, routeServiceURL, credentialsMap, tags := serviceInstanceRepo.CreateArgsForCall(0) 168 Expect(name).To(Equal("service-instance")) 169 Expect(drainURL).To(Equal("")) 170 Expect(routeServiceURL).To(Equal("")) 171 Expect(credentialsMap).To(Equal(map[string]interface{}{})) 172 Expect(tags).To(Equal([]string{})) 173 }) 174 175 Context("when creating the user provided service instance succeeds", func() { 176 BeforeEach(func() { 177 serviceInstanceRepo.CreateReturns(nil) 178 }) 179 180 It("tells the user OK", func() { 181 Expect(runCLIErr).NotTo(HaveOccurred()) 182 Expect(ui.Outputs()).To(ContainSubstrings( 183 []string{"OK"}, 184 )) 185 }) 186 }) 187 188 Context("when creating the user provided service instance fails", func() { 189 BeforeEach(func() { 190 serviceInstanceRepo.CreateReturns(errors.New("create-err")) 191 }) 192 193 It("fails with error", func() { 194 Expect(runCLIErr).To(HaveOccurred()) 195 Expect(runCLIErr.Error()).To(Equal("create-err")) 196 }) 197 }) 198 199 Context("when the -l flag is passed", func() { 200 BeforeEach(func() { 201 flagContext.Parse("service-instance", "-l", "drain-url") 202 }) 203 204 It("tries to create the user provided service instance with the drain url", func() { 205 Expect(runCLIErr).NotTo(HaveOccurred()) 206 Expect(serviceInstanceRepo.CreateCallCount()).To(Equal(1)) 207 _, drainURL, _, _, _ := serviceInstanceRepo.CreateArgsForCall(0) 208 Expect(drainURL).To(Equal("drain-url")) 209 }) 210 }) 211 212 Context("when the -r flag is passed", func() { 213 BeforeEach(func() { 214 flagContext.Parse("service-instance", "-r", "route-service-url") 215 }) 216 217 It("tries to create the user provided service instance with the route service url", func() { 218 Expect(runCLIErr).NotTo(HaveOccurred()) 219 Expect(serviceInstanceRepo.CreateCallCount()).To(Equal(1)) 220 _, _, routeServiceURL, _, _ := serviceInstanceRepo.CreateArgsForCall(0) 221 Expect(routeServiceURL).To(Equal("route-service-url")) 222 }) 223 }) 224 225 Context("when the -p flag is passed with inline JSON", func() { 226 BeforeEach(func() { 227 flagContext.Parse("service-instance", "-p", `"{"some":"json"}"`) 228 }) 229 230 It("tries to create the user provided service instance with the credentials", func() { 231 Expect(runCLIErr).NotTo(HaveOccurred()) 232 Expect(serviceInstanceRepo.CreateCallCount()).To(Equal(1)) 233 _, _, _, credentialsMap, _ := serviceInstanceRepo.CreateArgsForCall(0) 234 Expect(credentialsMap).To(Equal(map[string]interface{}{ 235 "some": "json", 236 })) 237 }) 238 }) 239 240 Context("when the -p flag is passed with a file containing JSON", func() { 241 var filename string 242 243 BeforeEach(func() { 244 tempfile, err := ioutil.TempFile("", "create-user-provided-service-test") 245 Expect(err).NotTo(HaveOccurred()) 246 Expect(tempfile.Close()).NotTo(HaveOccurred()) 247 filename = tempfile.Name() 248 249 jsonData := `{"some":"json"}` 250 ioutil.WriteFile(filename, []byte(jsonData), os.ModePerm) 251 flagContext.Parse("service-instance", "-p", filename) 252 }) 253 254 AfterEach(func() { 255 Expect(os.RemoveAll(filename)).NotTo(HaveOccurred()) 256 }) 257 258 It("tries to create the user provided service instance with the credentials", func() { 259 Expect(runCLIErr).NotTo(HaveOccurred()) 260 Expect(serviceInstanceRepo.CreateCallCount()).To(Equal(1)) 261 _, _, _, credentialsMap, _ := serviceInstanceRepo.CreateArgsForCall(0) 262 Expect(credentialsMap).To(Equal(map[string]interface{}{ 263 "some": "json", 264 })) 265 }) 266 }) 267 268 Context("when the -p flag is passed with inline JSON", func() { 269 BeforeEach(func() { 270 flagContext.Parse("service-instance", "-p", `key1,key2`) 271 ui.Inputs = []string{"value1", "value2"} 272 }) 273 274 It("prompts the user for the values", func() { 275 Expect(runCLIErr).NotTo(HaveOccurred()) 276 Expect(ui.Prompts).To(ContainSubstrings( 277 []string{"key1"}, 278 []string{"key2"}, 279 )) 280 }) 281 282 It("tries to create the user provided service instance with the credentials", func() { 283 Expect(runCLIErr).NotTo(HaveOccurred()) 284 285 Expect(serviceInstanceRepo.CreateCallCount()).To(Equal(1)) 286 _, _, _, credentialsMap, _ := serviceInstanceRepo.CreateArgsForCall(0) 287 Expect(credentialsMap).To(Equal(map[string]interface{}{ 288 "key1": "value1", 289 "key2": "value2", 290 })) 291 }) 292 }) 293 294 Context("when passing in tags", func() { 295 BeforeEach(func() { 296 flagContext.Parse("service-instance", "-t", "tag1, tag2, tag3, tag4") 297 }) 298 299 It("sucessfully creates a service instance and passes the tags as json", func() { 300 Expect(runCLIErr).NotTo(HaveOccurred()) 301 Expect(serviceInstanceRepo.CreateCallCount()).To(Equal(1)) 302 _, _, _, _, tags := serviceInstanceRepo.CreateArgsForCall(0) 303 Expect(tags).To(ConsistOf("tag1", "tag2", "tag3", "tag4")) 304 }) 305 }) 306 }) 307 })