github.com/swisscom/cloudfoundry-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 }