github.com/sleungcy-sap/cli@v7.1.0+incompatible/integration/v7/isolated/marketplace_command_test.go (about)

     1  package isolated
     2  
     3  import (
     4  	"strings"
     5  
     6  	"code.cloudfoundry.org/cli/integration/assets/hydrabroker/config"
     7  
     8  	"code.cloudfoundry.org/cli/integration/helpers/servicebrokerstub"
     9  
    10  	"code.cloudfoundry.org/cli/integration/helpers"
    11  
    12  	. "github.com/onsi/ginkgo"
    13  	. "github.com/onsi/gomega"
    14  	. "github.com/onsi/gomega/gbytes"
    15  	. "github.com/onsi/gomega/gexec"
    16  )
    17  
    18  var _ = Describe("marketplace command", func() {
    19  	Describe("help", func() {
    20  		When("the --help flag is set", func() {
    21  			It("displays command usage to output", func() {
    22  				session := helpers.CF("marketplace", "--help")
    23  				Eventually(session).Should(Exit(0))
    24  				expectMarketplaceHelpMessage(session)
    25  			})
    26  		})
    27  
    28  		When("more than required number of args are passed", func() {
    29  			It("displays an error message with help text and exits 1", func() {
    30  				session := helpers.CF("marketplace", "lala")
    31  				Eventually(session).Should(Exit(1))
    32  				Expect(session.Err).To(Say(`Incorrect Usage: unexpected argument "lala"`))
    33  				expectMarketplaceHelpMessage(session)
    34  			})
    35  		})
    36  	})
    37  
    38  	When("an API target is not set", func() {
    39  		BeforeEach(func() {
    40  			helpers.UnsetAPI()
    41  		})
    42  
    43  		It("displays an error message that no API endpoint is set", func() {
    44  			session := helpers.CF("marketplace")
    45  			Eventually(session).Should(Exit(1))
    46  
    47  			Expect(session).To(Say("FAILED"))
    48  			Expect(session.Err).To(Say(`No API endpoint set\. Use 'cf login' or 'cf api' to target an endpoint\.`))
    49  		})
    50  	})
    51  
    52  	When("services and plans are registered", func() {
    53  		var (
    54  			org1, org2, space1, space2 string
    55  			broker1, broker2, broker3  *servicebrokerstub.ServiceBrokerStub
    56  		)
    57  
    58  		BeforeEach(func() {
    59  			helpers.LoginCF()
    60  
    61  			org1 = helpers.NewOrgName()
    62  			org2 = helpers.NewOrgName()
    63  			space1 = helpers.NewSpaceName()
    64  			space2 = helpers.NewSpaceName()
    65  			helpers.CreateOrgAndSpace(org1, space1)
    66  			helpers.CreateOrgAndSpace(org2, space2)
    67  
    68  			broker1 = servicebrokerstub.EnableServiceAccess()
    69  			broker2 = servicebrokerstub.New().WithHigherNameThan(broker1).WithServiceOfferings(2).WithPlans(4).Register()
    70  
    71  			Eventually(helpers.CF(
    72  				"enable-service-access", broker2.FirstServiceOfferingName(),
    73  				"-b", broker2.Name,
    74  				"-p", broker2.Services[0].Plans[0].Name,
    75  				"-o", org1,
    76  			)).Should(Exit(0))
    77  
    78  			Eventually(helpers.CF(
    79  				"enable-service-access", broker2.FirstServiceOfferingName(),
    80  				"-b", broker2.Name,
    81  				"-p", broker2.Services[0].Plans[1].Name,
    82  				"-o", org2,
    83  			)).Should(Exit(0))
    84  
    85  			Eventually(helpers.CF(
    86  				"enable-service-access", broker2.FirstServiceOfferingName(),
    87  				"-b", broker2.Name,
    88  				"-p", broker2.Services[0].Plans[2].Name,
    89  			)).Should(Exit(0))
    90  
    91  			Eventually(helpers.CF(
    92  				"enable-service-access", broker2.Services[1].Name,
    93  				"-b", broker2.Name,
    94  			)).Should(Exit(0))
    95  
    96  			broker3 = servicebrokerstub.New().WithHigherNameThan(broker2).WithPlans(2)
    97  			broker3.Services[0].Name = broker2.Services[0].Name
    98  			broker3.Services[0].Plans[0].Free = false
    99  			broker3.Services[0].Plans[0].Costs = []config.Cost{
   100  				{
   101  					Amount: map[string]float64{"gbp": 600.00, "usd": 649.00},
   102  					Unit:   "MONTHLY",
   103  				},
   104  				{
   105  					Amount: map[string]float64{"usd": 0.999},
   106  					Unit:   "1GB of messages over 20GB",
   107  				},
   108  			}
   109  			broker3.Services[0].Plans[1].Free = false
   110  			broker3.EnableServiceAccess()
   111  		})
   112  
   113  		AfterEach(func() {
   114  			helpers.LoginCF()
   115  			helpers.QuickDeleteOrg(org1)
   116  			helpers.QuickDeleteOrg(org2)
   117  			broker1.Forget()
   118  			broker2.Forget()
   119  			broker3.Forget()
   120  		})
   121  
   122  		Context("no service name filter", func() {
   123  			When("not logged in", func() {
   124  				BeforeEach(func() {
   125  					helpers.LogoutCF()
   126  				})
   127  
   128  				It("displays all public offerings and plans", func() {
   129  					session := helpers.CF("marketplace")
   130  					Eventually(session).Should(Exit(0))
   131  
   132  					Expect(session).To(Say(`Getting all service offerings from marketplace\.\.\.`))
   133  					Expect(session).To(Say(`\n\n`))
   134  					Expect(session).To(Say(`offering\s+plans\s+description\s+broker`))
   135  					Expect(session).To(Say(`%s\s+%s\s+%s\s+%s`, broker1.FirstServiceOfferingName(), planNamesOf(broker1), broker1.FirstServiceOfferingDescription(), broker1.Name))
   136  					Expect(session).To(Say(`%s\s+%s\s+%s\s+%s`, broker2.FirstServiceOfferingName(), broker2.Services[0].Plans[2].Name, broker2.FirstServiceOfferingDescription(), broker2.Name))
   137  					Expect(session).To(Say(`%s\s+%s\s+%s\s+%s`, broker2.Services[1].Name, broker2.Services[1].Plans[0].Name, broker2.Services[1].Description, broker2.Name))
   138  					Expect(session).To(Say(`%s\s+%s\s+%s\s+%s`, broker3.FirstServiceOfferingName(), planNamesOf(broker3), broker3.FirstServiceOfferingDescription(), broker3.Name))
   139  					Expect(session).To(Say(`\n\n`))
   140  					Expect(session).To(Say(`TIP: Use 'cf marketplace -e SERVICE_OFFERING' to view descriptions of individual plans of a given service offering\.`))
   141  				})
   142  
   143  				It("can filter by service broker name", func() {
   144  					session := helpers.CF("marketplace", "-b", broker2.Name)
   145  					Eventually(session).Should(Exit(0))
   146  
   147  					Expect(session).To(Say(`Getting all service offerings from marketplace for service broker %s\.\.\.`, broker2.Name))
   148  					Expect(session).To(Say(`\n\n`))
   149  					Expect(session).To(Say(`offering\s+plans\s+description\s+broker`))
   150  					Expect(session).To(Say(`%s\s+%s\s+%s\s+%s`, broker2.FirstServiceOfferingName(), broker2.Services[0].Plans[2].Name, broker2.FirstServiceOfferingDescription(), broker2.Name))
   151  					Expect(session).To(Say(`%s\s+%s\s+%s\s+%s`, broker2.Services[1].Name, broker2.Services[1].Plans[0].Name, broker2.Services[1].Description, broker2.Name))
   152  					Expect(session).To(Say(`\n\n`))
   153  					Expect(session).To(Say(`TIP: Use 'cf marketplace -e SERVICE_OFFERING' to view descriptions of individual plans of a given service offering\.`))
   154  
   155  					Expect(string(session.Out.Contents())).NotTo(SatisfyAny(
   156  						ContainSubstring(broker1.Name),
   157  						ContainSubstring(broker3.Name),
   158  					))
   159  				})
   160  			})
   161  
   162  			When("logged in and targeting a space", func() {
   163  				var username string
   164  
   165  				BeforeEach(func() {
   166  					helpers.TargetOrgAndSpace(org1, space1)
   167  					username, _ = helpers.GetCredentials()
   168  				})
   169  
   170  				It("displays public offerings and plans, and those enabled for that space", func() {
   171  					session := helpers.CF("marketplace")
   172  					Eventually(session).Should(Exit(0))
   173  
   174  					broker2Plans := strings.Join([]string{
   175  						broker2.Services[0].Plans[0].Name,
   176  						broker2.Services[0].Plans[2].Name},
   177  						", ",
   178  					)
   179  
   180  					Expect(session).To(Say(`Getting all service offerings from marketplace in org %s / space %s as %s\.\.\.`, org1, space1, username))
   181  					Expect(session).To(Say(`\n\n`))
   182  					Expect(session).To(Say(`offering\s+plans\s+description\s+broker`))
   183  					Expect(session).To(Say(`%s\s+%s\s+%s\s+%s`, broker1.FirstServiceOfferingName(), planNamesOf(broker1), broker1.FirstServiceOfferingDescription(), broker1.Name))
   184  					Expect(session).To(Say(`%s\s+%s\s+%s\s+%s`, broker2.FirstServiceOfferingName(), broker2Plans, broker2.FirstServiceOfferingDescription(), broker2.Name))
   185  					Expect(session).To(Say(`%s\s+%s\s+%s\s+%s`, broker2.Services[1].Name, broker2.Services[1].Plans[0].Name, broker2.Services[1].Description, broker2.Name))
   186  					Expect(session).To(Say(`%s\s+%s\s+%s\s+%s`, broker3.FirstServiceOfferingName(), planNamesOf(broker3), broker3.FirstServiceOfferingDescription(), broker3.Name))
   187  					Expect(session).To(Say(`\n\n`))
   188  					Expect(session).To(Say(`TIP: Use 'cf marketplace -e SERVICE_OFFERING' to view descriptions of individual plans of a given service offering\.`))
   189  				})
   190  
   191  				It("can filter by service broker name", func() {
   192  					session := helpers.CF("marketplace", "-b", broker2.Name)
   193  					Eventually(session).Should(Exit(0))
   194  
   195  					broker2Plans := strings.Join([]string{
   196  						broker2.Services[0].Plans[0].Name,
   197  						broker2.Services[0].Plans[2].Name},
   198  						", ",
   199  					)
   200  
   201  					Expect(session).To(Say(`Getting all service offerings from marketplace for service broker %s in org %s / space %s as %s\.\.\.`, broker2.Name, org1, space1, username))
   202  					Expect(session).To(Say(`\n\n`))
   203  					Expect(session).To(Say(`offering\s+plans\s+description\s+broker`))
   204  					Expect(session).To(Say(`%s\s+%s\s+%s\s+%s`, broker2.FirstServiceOfferingName(), broker2Plans, broker2.FirstServiceOfferingDescription(), broker2.Name))
   205  					Expect(session).To(Say(`%s\s+%s\s+%s\s+%s`, broker2.Services[1].Name, broker2.Services[1].Plans[0].Name, broker2.Services[1].Description, broker2.Name))
   206  					Expect(session).To(Say(`\n\n`))
   207  					Expect(session).To(Say(`TIP: Use 'cf marketplace -e SERVICE_OFFERING' to view descriptions of individual plans of a given service offering\.`))
   208  
   209  					Expect(string(session.Out.Contents())).NotTo(SatisfyAny(
   210  						ContainSubstring(broker1.Name),
   211  						ContainSubstring(broker3.Name),
   212  					))
   213  				})
   214  			})
   215  		})
   216  
   217  		Context("filtering by service offering name", func() {
   218  			When("not logged in", func() {
   219  				BeforeEach(func() {
   220  					helpers.LogoutCF()
   221  				})
   222  
   223  				It("filters by service offering name", func() {
   224  					session := helpers.CF("marketplace", "-e", broker2.Services[0].Name)
   225  					Eventually(session).Should(Exit(0))
   226  
   227  					Expect(session).To(Say(`Getting service plan information for service offering %s\.\.\.`, broker2.Services[0].Name))
   228  					expectMarketplaceServiceOfferingOutput(session, broker2, broker3)
   229  
   230  					Expect(string(session.Out.Contents())).NotTo(SatisfyAny(
   231  						ContainSubstring(broker1.Name),
   232  						ContainSubstring(broker2.Services[1].Name),
   233  					))
   234  				})
   235  
   236  				It("can also filter by service broker name", func() {
   237  					session := helpers.CF("marketplace", "-e", broker2.Services[0].Name, "-b", broker2.Name)
   238  					Eventually(session).Should(Exit(0))
   239  
   240  					Expect(session).To(Say(`Getting service plan information for service offering %s from service broker %s\.\.\.`, broker2.Services[0].Name, broker2.Name))
   241  					Expect(session).To(Say(`\n\n`))
   242  					Expect(session).To(Say(`broker: %s`, broker2.Name))
   243  					Expect(session).To(Say(`plan\s+description+\s+free or paid\s+costs\s+available`))
   244  					Expect(session).To(Say(`%s\s+%s\s+%s\s+%s`, broker2.Services[0].Plans[2].Name, broker2.Services[0].Plans[2].Description, "free", "yes"))
   245  
   246  					Expect(string(session.Out.Contents())).NotTo(SatisfyAny(
   247  						ContainSubstring(broker1.Name),
   248  						ContainSubstring(broker2.Services[1].Plans[0].Name),
   249  						ContainSubstring(broker3.Name),
   250  					))
   251  				})
   252  			})
   253  
   254  			When("logged in and targeting a space", func() {
   255  				var username string
   256  
   257  				BeforeEach(func() {
   258  					helpers.TargetOrgAndSpace(org1, space1)
   259  					username, _ = helpers.GetCredentials()
   260  				})
   261  
   262  				It("filters by service offering name", func() {
   263  					session := helpers.CF("marketplace", "-e", broker2.Services[0].Name)
   264  					Eventually(session).Should(Exit(0))
   265  
   266  					Expect(session).To(Say(`Getting service plan information for service offering %s in org %s / space %s as %s\.\.\.`, broker2.Services[0].Name, org1, space1, username))
   267  					expectMarketplaceServiceOfferingOutput(session, broker2, broker3)
   268  				})
   269  
   270  				It("can also filter by service broker name", func() {
   271  					session := helpers.CF("marketplace", "-e", broker2.Services[0].Name, "-b", broker2.Name)
   272  					Eventually(session).Should(Exit(0))
   273  
   274  					Expect(session).To(Say(`Getting service plan information for service offering %s from service broker %s in org %s / space %s as %s\.\.\.`, broker2.Services[0].Name, broker2.Name, org1, space1, username))
   275  					Expect(session).To(Say(`\n\n`))
   276  					Expect(session).To(Say(`broker: %s`, broker2.Name))
   277  					Expect(session).To(Say(`plan\s+description\s+free or paid\s+costs\s+available`))
   278  					Expect(session).To(Say(`%s\s+%s\s+%s\s+%s`, broker2.Services[0].Plans[2].Name, broker2.Services[0].Plans[2].Description, "free", "yes"))
   279  
   280  					Expect(string(session.Out.Contents())).NotTo(SatisfyAny(
   281  						ContainSubstring(broker1.Name),
   282  						ContainSubstring(broker3.Name),
   283  					))
   284  				})
   285  			})
   286  		})
   287  	})
   288  })
   289  
   290  func expectMarketplaceServiceOfferingOutput(session *Session, broker2, broker3 *servicebrokerstub.ServiceBrokerStub) {
   291  	Expect(session).To(Say(`\n\n`))
   292  	Expect(session).To(Say(`broker: %s`, broker2.Name))
   293  	Expect(session).To(Say(`plan\s+description\s+free or paid\s+costs\s+available`))
   294  	Expect(session).To(Say(`%s\s+%s\s+%s\s+%s`, broker2.Services[0].Plans[2].Name, broker2.Services[0].Plans[2].Description, "free", "yes"))
   295  
   296  	Expect(session).To(Say(`\n\n`))
   297  	Expect(session).To(Say(`broker: %s`, broker3.Name))
   298  	Expect(session).To(Say(`plan\s+description\s+free or paid\s+costs\s+available`))
   299  	Expect(session).To(Say(`%s\s+%s\s+%s\s+%s\s+%s`, broker3.Services[0].Plans[0].Name, broker3.Services[0].Plans[0].Description, "paid", "GBP 600.00/MONTHLY, USD 649.00/MONTHLY, USD 1.00/1GB of messages over 20GB", "yes"))
   300  	Expect(session).To(Say(`%s\s+%s\s+%s\s+%s`, broker3.Services[0].Plans[1].Name, broker3.Services[0].Plans[1].Description, "paid", "yes"))
   301  }
   302  
   303  func planNamesOf(broker *servicebrokerstub.ServiceBrokerStub) string {
   304  	var planNames []string
   305  	for _, p := range broker.Services[0].Plans {
   306  		planNames = append(planNames, p.Name)
   307  	}
   308  	return strings.Join(planNames, ", ")
   309  }
   310  
   311  func expectMarketplaceHelpMessage(session *Session) {
   312  	Expect(session).To(Say(`NAME:`))
   313  	Expect(session).To(Say(`marketplace - List available offerings in the marketplace`))
   314  	Expect(session).To(Say(`USAGE:`))
   315  	Expect(session).To(Say(`cf marketplace \[-e SERVICE_OFFERING\] \[-b SERVICE_BROKER\] \[--no-plans\]`))
   316  	Expect(session).To(Say(`ALIAS:`))
   317  	Expect(session).To(Say(`m`))
   318  	Expect(session).To(Say(`OPTIONS:`))
   319  	Expect(session).To(Say(`-e\s+Show plan details for a particular service offering`))
   320  	Expect(session).To(Say(`--no-plans\s+Hide plan information for service offerings`))
   321  	Expect(session).To(Say(`create-service, services`))
   322  }