github.com/loafoe/cli@v7.1.0+incompatible/command/v7/marketplace_command_test.go (about) 1 package v7_test 2 3 import ( 4 "code.cloudfoundry.org/cli/actor/v7action" 5 "code.cloudfoundry.org/cli/command/commandfakes" 6 "code.cloudfoundry.org/cli/command/translatableerror" 7 . "code.cloudfoundry.org/cli/command/v7" 8 "code.cloudfoundry.org/cli/command/v7/v7fakes" 9 "code.cloudfoundry.org/cli/resources" 10 "code.cloudfoundry.org/cli/util/configv3" 11 "code.cloudfoundry.org/cli/util/ui" 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/ginkgo/extensions/table" 14 . "github.com/onsi/gomega" 15 . "github.com/onsi/gomega/gbytes" 16 "github.com/pkg/errors" 17 ) 18 19 var _ = Describe("marketplace command", func() { 20 var ( 21 cmd MarketplaceCommand 22 testUI *ui.UI 23 fakeConfig *commandfakes.FakeConfig 24 fakeSharedActor *commandfakes.FakeSharedActor 25 fakeActor *v7fakes.FakeActor 26 ) 27 28 BeforeEach(func() { 29 testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer()) 30 fakeConfig = new(commandfakes.FakeConfig) 31 fakeSharedActor = new(commandfakes.FakeSharedActor) 32 fakeActor = new(v7fakes.FakeActor) 33 34 cmd = MarketplaceCommand{ 35 BaseCommand: BaseCommand{ 36 UI: testUI, 37 Config: fakeConfig, 38 SharedActor: fakeSharedActor, 39 Actor: fakeActor, 40 }, 41 } 42 43 fakeConfig.TargetedSpaceReturns(configv3.Space{ 44 GUID: "fake-space-guid", 45 Name: "fake-space-name", 46 }) 47 48 fakeConfig.TargetedOrganizationReturns(configv3.Organization{ 49 GUID: "fake-org-guid", 50 Name: "fake-org-name", 51 }) 52 53 fakeConfig.CurrentUserReturns(configv3.User{Name: "fake-username"}, nil) 54 }) 55 56 Describe("pre-flight checks", func() { 57 var executeErr error 58 59 JustBeforeEach(func() { 60 executeErr = cmd.Execute(nil) 61 }) 62 63 It("checks the login status", func() { 64 Expect(fakeSharedActor.IsLoggedInCallCount()).To(Equal(1)) 65 }) 66 67 When("logged in", func() { 68 BeforeEach(func() { 69 fakeSharedActor.IsLoggedInReturns(true) 70 }) 71 72 It("gets the user", func() { 73 Expect(fakeConfig.CurrentUserCallCount()).To(Equal(1)) 74 }) 75 76 It("checks the target", func() { 77 Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1)) 78 checkOrg, checkSpace := fakeSharedActor.CheckTargetArgsForCall(0) 79 Expect(checkOrg).To(BeTrue()) 80 Expect(checkSpace).To(BeTrue()) 81 }) 82 83 When("getting the user fails", func() { 84 BeforeEach(func() { 85 fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("fake get user error")) 86 }) 87 88 It("returns an error", func() { 89 Expect(executeErr).To(MatchError("fake get user error")) 90 }) 91 }) 92 93 When("checking the target fails", func() { 94 BeforeEach(func() { 95 fakeSharedActor.CheckTargetReturns(errors.New("fake target error")) 96 }) 97 98 It("returns an error", func() { 99 Expect(executeErr).To(MatchError("fake target error")) 100 }) 101 }) 102 }) 103 104 When("not logged in", func() { 105 BeforeEach(func() { 106 fakeSharedActor.IsLoggedInReturns(false) 107 }) 108 109 It("does not try to get the username or check the target", func() { 110 Expect(fakeConfig.CurrentUserCallCount()).To(Equal(0)) 111 Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(0)) 112 }) 113 }) 114 115 When("the -e and --no-plans flags to be specified together", func() { 116 BeforeEach(func() { 117 setFlag(&cmd, "--no-plans") 118 setFlag(&cmd, "-e", "foo") 119 }) 120 121 It("returns an error", func() { 122 Expect(executeErr).To(MatchError(translatableerror.ArgumentCombinationError{ 123 Args: []string{"--no-plans", "-e"}, 124 })) 125 }) 126 }) 127 }) 128 129 DescribeTable( 130 "printing the action", 131 func(loggedIn bool, flags map[string]interface{}, message string) { 132 fakeSharedActor.IsLoggedInReturns(loggedIn) 133 134 for k, v := range flags { 135 setFlag(&cmd, k, v) 136 } 137 138 err := cmd.Execute(nil) 139 Expect(err).NotTo(HaveOccurred()) 140 141 Expect(testUI.Out).To(Say(message)) 142 }, 143 Entry( 144 "not logged in with no flags", 145 false, 146 map[string]interface{}{}, 147 `Getting all service offerings from marketplace\.\.\.`, 148 ), 149 Entry( 150 "not logged in with -e flag", 151 false, 152 map[string]interface{}{ 153 "-e": "fake-service-offering-name", 154 }, 155 `Getting service plan information for service offering fake-service-offering-name\.\.\.`, 156 ), 157 Entry( 158 "not logged in with -b flag", 159 false, 160 map[string]interface{}{ 161 "-b": "fake-service-broker-name", 162 }, 163 `Getting all service offerings from marketplace for service broker fake-service-broker-name\.\.\.`, 164 ), 165 Entry( 166 "not logged in with -e and -b flag", 167 false, 168 map[string]interface{}{ 169 "-b": "fake-service-broker-name", 170 "-e": "fake-service-offering-name", 171 }, 172 `Getting service plan information for service offering fake-service-offering-name from service broker fake-service-broker-name\.\.\.`, 173 ), 174 Entry( 175 "logged in with no flags", 176 true, 177 map[string]interface{}{}, 178 `Getting all service offerings from marketplace in org fake-org-name / space fake-space-name as fake-username\.\.\.`, 179 ), 180 Entry( 181 "logged in with -e flag", 182 true, 183 map[string]interface{}{ 184 "-e": "fake-service-offering-name", 185 }, 186 `Getting service plan information for service offering fake-service-offering-name in org fake-org-name / space fake-space-name as fake-username\.\.\.`, 187 ), 188 Entry( 189 "logged in with -b flag", 190 true, 191 map[string]interface{}{ 192 "-b": "fake-service-broker-name", 193 }, 194 `Getting all service offerings from marketplace for service broker fake-service-broker-name in org fake-org-name / space fake-space-name as fake-username\.\.\.`, 195 ), 196 Entry( 197 "logged in with -e and -b flag", 198 true, 199 map[string]interface{}{ 200 "-e": "fake-service-offering-name", 201 "-b": "fake-service-broker-name", 202 }, 203 `Getting service plan information for service offering fake-service-offering-name from service broker fake-service-broker-name in org fake-org-name / space fake-space-name as fake-username\.\.\.`, 204 ), 205 ) 206 207 DescribeTable( 208 "sending the filter to the actor", 209 func(loggedIn bool, flags map[string]interface{}, expectedFilter v7action.MarketplaceFilter) { 210 fakeSharedActor.IsLoggedInReturns(loggedIn) 211 212 for k, v := range flags { 213 setFlag(&cmd, k, v) 214 } 215 216 err := cmd.Execute(nil) 217 Expect(err).NotTo(HaveOccurred()) 218 219 Expect(fakeActor.MarketplaceCallCount()).To(Equal(1)) 220 Expect(fakeActor.MarketplaceArgsForCall(0)).To(Equal(expectedFilter)) 221 }, 222 Entry( 223 "not logged in with no flags", 224 false, 225 map[string]interface{}{}, 226 v7action.MarketplaceFilter{}, 227 ), 228 Entry( 229 "not logged in with -e flag", 230 false, 231 map[string]interface{}{ 232 "-e": "fake-service-offering-name", 233 }, 234 v7action.MarketplaceFilter{ 235 ServiceOfferingName: "fake-service-offering-name", 236 }, 237 ), 238 Entry( 239 "not logged in with -b flag", 240 false, 241 map[string]interface{}{ 242 "-b": "fake-service-broker-name", 243 }, 244 v7action.MarketplaceFilter{ 245 ServiceBrokerName: "fake-service-broker-name", 246 }, 247 ), 248 Entry( 249 "not logged in with -e and -b flag", 250 false, 251 map[string]interface{}{ 252 "-b": "fake-service-broker-name", 253 "-e": "fake-service-offering-name", 254 }, 255 v7action.MarketplaceFilter{ 256 ServiceOfferingName: "fake-service-offering-name", 257 ServiceBrokerName: "fake-service-broker-name", 258 }, 259 ), 260 Entry( 261 "logged in with no flags", 262 true, 263 map[string]interface{}{}, 264 v7action.MarketplaceFilter{ 265 SpaceGUID: "fake-space-guid", 266 }, 267 ), 268 Entry( 269 "logged in with -e flag", 270 true, 271 map[string]interface{}{ 272 "-e": "fake-service-offering-name", 273 }, 274 v7action.MarketplaceFilter{ 275 SpaceGUID: "fake-space-guid", 276 ServiceOfferingName: "fake-service-offering-name", 277 }, 278 ), 279 Entry( 280 "logged in with -b flag", 281 true, 282 map[string]interface{}{ 283 "-b": "fake-service-broker-name", 284 }, 285 v7action.MarketplaceFilter{ 286 SpaceGUID: "fake-space-guid", 287 ServiceBrokerName: "fake-service-broker-name", 288 }, 289 ), 290 Entry( 291 "logged in with -e and -b flag", 292 true, 293 map[string]interface{}{ 294 "-e": "fake-service-offering-name", 295 "-b": "fake-service-broker-name", 296 }, 297 v7action.MarketplaceFilter{ 298 SpaceGUID: "fake-space-guid", 299 ServiceOfferingName: "fake-service-offering-name", 300 ServiceBrokerName: "fake-service-broker-name", 301 }, 302 ), 303 ) 304 305 Describe("handling the result from the actor", func() { 306 var executeErr error 307 308 JustBeforeEach(func() { 309 executeErr = cmd.Execute(nil) 310 }) 311 312 When("the actor returns warnings", func() { 313 BeforeEach(func() { 314 fakeActor.MarketplaceReturns( 315 []v7action.ServiceOfferingWithPlans{{}}, 316 v7action.Warnings{"warning 1", "warning 2"}, 317 nil, 318 ) 319 }) 320 321 It("prints then", func() { 322 Expect(testUI.Err).To(Say(`warning 1`)) 323 Expect(testUI.Err).To(Say(`warning 2`)) 324 }) 325 }) 326 327 When("the actor returns an error", func() { 328 BeforeEach(func() { 329 fakeActor.MarketplaceReturns( 330 []v7action.ServiceOfferingWithPlans{{}}, 331 v7action.Warnings{"warning 1", "warning 2"}, 332 errors.New("awful error"), 333 ) 334 }) 335 336 It("prints warnings and returns an error", func() { 337 Expect(testUI.Err).To(Say(`warning 1`)) 338 Expect(testUI.Err).To(Say(`warning 2`)) 339 Expect(executeErr).To(MatchError("awful error")) 340 }) 341 }) 342 343 When("no offerings are returned", func() { 344 BeforeEach(func() { 345 fakeActor.MarketplaceReturns( 346 []v7action.ServiceOfferingWithPlans{}, 347 v7action.Warnings{"warning 1", "warning 2"}, 348 nil, 349 ) 350 }) 351 352 It("says that no service offerings were found", func() { 353 Expect(executeErr).NotTo(HaveOccurred()) 354 355 Expect(testUI.Out).To(Say(`\n\n`)) 356 Expect(testUI.Out).To(Say(`No service offerings found.`)) 357 358 Expect(testUI.Err).To(Say("warning 1")) 359 Expect(testUI.Err).To(Say("warning 2")) 360 }) 361 }) 362 363 When("showing the service offerings table", func() { 364 BeforeEach(func() { 365 fakeActor.MarketplaceReturns( 366 []v7action.ServiceOfferingWithPlans{ 367 { 368 GUID: "offering-guid-1", 369 Name: "offering-1", 370 Description: "about offering 1", 371 ServiceBrokerName: "service-broker-1", 372 Plans: []resources.ServicePlan{ 373 { 374 GUID: "plan-guid-1", 375 Name: "plan-1", 376 }, 377 }, 378 }, 379 { 380 GUID: "offering-guid-2", 381 Name: "offering-2", 382 Description: "about offering 2", 383 ServiceBrokerName: "service-broker-2", 384 Plans: []resources.ServicePlan{ 385 { 386 GUID: "plan-guid-2", 387 Name: "plan-2", 388 }, 389 { 390 GUID: "plan-guid-3", 391 Name: "plan-3", 392 }, 393 }, 394 }, 395 }, 396 v7action.Warnings{"warning 1", "warning 2"}, 397 nil, 398 ) 399 }) 400 401 It("prints a table showing service offerings", func() { 402 Expect(executeErr).NotTo(HaveOccurred()) 403 404 Expect(testUI.Out).To(Say(`\n\n`)) 405 Expect(testUI.Out).To(Say(`offering\s+plans\s+description\s+broker`)) 406 Expect(testUI.Out).To(Say(`offering-1\s+plan-1\s+about offering 1\s+service-broker-1`)) 407 Expect(testUI.Out).To(Say(`offering-2\s+plan-2, plan-3\s+about offering 2\s+service-broker-2`)) 408 Expect(testUI.Out).To(Say(`\n\n`)) 409 Expect(testUI.Out).To(Say(`TIP: Use 'cf marketplace -e SERVICE_OFFERING' to view descriptions of individual plans of a given service offering\.`)) 410 411 Expect(testUI.Err).To(Say("warning 1")) 412 Expect(testUI.Err).To(Say("warning 2")) 413 }) 414 415 When("the --no-plans flag is specified", func() { 416 BeforeEach(func() { 417 setFlag(&cmd, "--no-plans") 418 }) 419 420 It("prints a table showing service offerings without plan names", func() { 421 Expect(executeErr).NotTo(HaveOccurred()) 422 423 Expect(testUI.Out).To(Say(`\n\n`)) 424 Expect(testUI.Out).To(Say(`offering\s+description\s+broker`)) 425 Expect(testUI.Out).To(Say(`offering-1\s+about offering 1\s+service-broker-1`)) 426 Expect(testUI.Out).To(Say(`offering-2\s+about offering 2\s+service-broker-2`)) 427 Expect(testUI.Out).To(Say(`\n\n`)) 428 Expect(testUI.Out).To(Say(`TIP: Use 'cf marketplace -e SERVICE_OFFERING' to view descriptions of individual plans of a given service offering\.`)) 429 430 Expect(testUI.Err).To(Say("warning 1")) 431 Expect(testUI.Err).To(Say("warning 2")) 432 }) 433 }) 434 }) 435 436 When("showing the service plans table", func() { 437 BeforeEach(func() { 438 setFlag(&cmd, "-e", "fake-service-offering-name") 439 440 fakeActor.MarketplaceReturns( 441 []v7action.ServiceOfferingWithPlans{ 442 { 443 GUID: "offering-guid-1", 444 Name: "interesting-name", 445 Description: "about offering 1", 446 ServiceBrokerName: "service-broker-1", 447 Plans: []resources.ServicePlan{ 448 { 449 GUID: "plan-guid-1", 450 Name: "plan-1", 451 Description: "best available plan", 452 Available: true, 453 Free: true, 454 }, 455 }, 456 }, 457 { 458 GUID: "offering-guid-2", 459 Name: "interesting-name", 460 Description: "about offering 2", 461 ServiceBrokerName: "service-broker-2", 462 Plans: []resources.ServicePlan{ 463 { 464 GUID: "plan-guid-2", 465 Name: "plan-2", 466 Description: "just another plan", 467 Available: true, 468 Free: false, 469 Costs: []resources.ServicePlanCost{ 470 { 471 Currency: "USD", 472 Amount: 100, 473 Unit: "Monthly", 474 }, 475 { 476 Currency: "USD", 477 Amount: 0.999, 478 Unit: "1GB of messages over 20GB", 479 }, 480 }, 481 }, 482 { 483 GUID: "plan-guid-3", 484 Name: "plan-3", 485 Free: true, 486 Available: false, 487 }, 488 { 489 GUID: "plan-guid-4", 490 Name: "plan-4", 491 Free: false, 492 Available: true, 493 }, 494 }, 495 }, 496 }, 497 v7action.Warnings{"warning 1", "warning 2"}, 498 nil, 499 ) 500 }) 501 502 It("prints a table showing service plans", func() { 503 Expect(executeErr).NotTo(HaveOccurred()) 504 505 Expect(testUI.Out).To(Say(`\n\n`)) 506 Expect(testUI.Out).To(Say(`broker: service-broker-1`)) 507 Expect(testUI.Out).To(Say(`plan\s+description\s+free or paid\s+costs\s+available`)) 508 Expect(testUI.Out).To(Say(`plan-1\s+best available plan\s+free\s+yes`)) 509 Expect(testUI.Out).To(Say(`\n\n`)) 510 Expect(testUI.Out).To(Say(`broker: service-broker-2`)) 511 Expect(testUI.Out).To(Say(`plan\s+description\s+free or paid\s+costs\s+available`)) 512 Expect(testUI.Out).To(Say(`plan-2\s+just another plan\s+paid\s+USD 100.00/Monthly, USD 1.00/1GB of messages over 20GB\s+yes`)) 513 Expect(testUI.Out).To(Say(`plan-3\s+free\s+no`)) 514 Expect(testUI.Out).To(Say(`plan-4\s+paid\s+yes`)) 515 516 Expect(testUI.Err).To(Say("warning 1")) 517 Expect(testUI.Err).To(Say("warning 2")) 518 }) 519 }) 520 }) 521 })