github.com/niteshexa/cloudfoundry_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  })