github.com/swisscom/cloudfoundry-cli@v7.1.0+incompatible/command/v6/create_service_command_test.go (about) 1 package v6_test 2 3 import ( 4 "errors" 5 6 "code.cloudfoundry.org/cli/actor/v2action" 7 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 8 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv2" 9 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/constant" 10 "code.cloudfoundry.org/cli/command/commandfakes" 11 "code.cloudfoundry.org/cli/command/flag" 12 "code.cloudfoundry.org/cli/command/translatableerror" 13 . "code.cloudfoundry.org/cli/command/v6" 14 "code.cloudfoundry.org/cli/command/v6/v6fakes" 15 "code.cloudfoundry.org/cli/util/configv3" 16 "code.cloudfoundry.org/cli/util/ui" 17 . "github.com/onsi/ginkgo" 18 . "github.com/onsi/gomega" 19 . "github.com/onsi/gomega/gbytes" 20 ) 21 22 var _ = Describe("create-service Command", func() { 23 var ( 24 cmd CreateServiceCommand 25 testUI *ui.UI 26 fakeConfig *commandfakes.FakeConfig 27 fakeSharedActor *commandfakes.FakeSharedActor 28 fakeActor *v6fakes.FakeCreateServiceActor 29 executeErr error 30 extraArgs []string 31 ) 32 33 BeforeEach(func() { 34 testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer()) 35 fakeConfig = new(commandfakes.FakeConfig) 36 fakeSharedActor = new(commandfakes.FakeSharedActor) 37 fakeActor = new(v6fakes.FakeCreateServiceActor) 38 39 extraArgs = nil 40 cmd = CreateServiceCommand{ 41 UI: testUI, 42 Config: fakeConfig, 43 SharedActor: fakeSharedActor, 44 Actor: fakeActor, 45 RequiredArgs: flag.CreateServiceArgs{ 46 Service: "cool-broker", 47 ServiceInstance: "cool-service", 48 ServicePlan: "cool-plan", 49 }, 50 } 51 }) 52 53 JustBeforeEach(func() { 54 executeErr = cmd.Execute(extraArgs) 55 }) 56 57 When("the user provides extra arguments", func() { 58 BeforeEach(func() { 59 extraArgs = []string{"some-extra-arg"} 60 }) 61 62 It("fails with a TooManyArgumentsError", func() { 63 Expect(executeErr).To(MatchError(translatableerror.TooManyArgumentsError{ 64 ExtraArgument: "some-extra-arg", 65 })) 66 }) 67 }) 68 69 It("checks the user is logged in, and targeting an org and space", func() { 70 Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1)) 71 orgChecked, spaceChecked := fakeSharedActor.CheckTargetArgsForCall(0) 72 Expect(orgChecked).To(BeTrue()) 73 Expect(spaceChecked).To(BeTrue()) 74 }) 75 76 When("checking the target succeeds", func() { 77 BeforeEach(func() { 78 fakeSharedActor.CheckTargetReturns(nil) 79 fakeConfig.CurrentUserReturns( 80 configv3.User{Name: "some-user"}, 81 nil) 82 fakeConfig.TargetedOrganizationReturns(configv3.Organization{ 83 GUID: "some-org-guid", 84 Name: "some-org", 85 }) 86 fakeConfig.TargetedSpaceReturns(configv3.Space{ 87 GUID: "some-space-guid", 88 Name: "some-space", 89 }) 90 }) 91 92 When("creating a service is successful", func() { 93 BeforeEach(func() { 94 fakeActor.CreateServiceInstanceReturns(v2action.ServiceInstance{LastOperation: ccv2.LastOperation{State: constant.LastOperationSucceeded}}, []string{"a-warning", "another-warning"}, nil) 95 }) 96 97 It("displays a success message indicating that it is creating the service", func() { 98 Expect(executeErr).NotTo(HaveOccurred()) 99 Expect(testUI.Out).To(Say("Creating service instance cool-service in org some-org / space some-space as some-user\\.\\.\\.")) 100 Expect(testUI.Out).To(Say("OK")) 101 }) 102 103 It("passes the correct args when creating the service instance", func() { 104 Expect(executeErr).NotTo(HaveOccurred()) 105 Expect(fakeActor.CreateServiceInstanceCallCount()).To(Equal(1)) 106 spaceGUID, service, servicePlan, serviceInstance, _, _, _ := fakeActor.CreateServiceInstanceArgsForCall(0) 107 Expect(spaceGUID).To(Equal("some-space-guid")) 108 Expect(service).To(Equal("cool-broker")) 109 Expect(servicePlan).To(Equal("cool-plan")) 110 Expect(serviceInstance).To(Equal("cool-service")) 111 }) 112 113 It("displays all warnings", func() { 114 Expect(testUI.Err).To(Say("a-warning")) 115 Expect(testUI.Err).To(Say("another-warning")) 116 }) 117 118 Context("the user passes in tags", func() { 119 BeforeEach(func() { 120 cmd.Tags.IsSet = true 121 cmd.Tags.Value = []string{"tag-1", "tag-2"} 122 }) 123 124 It("passes the tags as args when creating the service instance", func() { 125 Expect(executeErr).NotTo(HaveOccurred()) 126 Expect(fakeActor.CreateServiceInstanceCallCount()).To(Equal(1)) 127 _, _, _, _, _, _, tags := fakeActor.CreateServiceInstanceArgsForCall(0) 128 Expect(tags).To(Equal([]string{"tag-1", "tag-2"})) 129 }) 130 }) 131 132 Context("the user passes in parameters", func() { 133 BeforeEach(func() { 134 cmd.ParametersAsJSON = map[string]interface{}{ 135 "some-key": "some-value", 136 } 137 }) 138 139 It("passes the parameters as args when creating the service instance", func() { 140 Expect(executeErr).NotTo(HaveOccurred()) 141 Expect(fakeActor.CreateServiceInstanceCallCount()).To(Equal(1)) 142 _, _, _, _, _, params, _ := fakeActor.CreateServiceInstanceArgsForCall(0) 143 Expect(params).To(Equal(map[string]interface{}{"some-key": "some-value"})) 144 }) 145 }) 146 147 Context("the user passes in broker name", func() { 148 BeforeEach(func() { 149 cmd.ServiceBroker = "some-broker" 150 }) 151 152 It("passes the broker name as arg when creating the service instance", func() { 153 Expect(executeErr).NotTo(HaveOccurred()) 154 Expect(fakeActor.CreateServiceInstanceCallCount()).To(Equal(1)) 155 _, _, _, _, brokerName, _, _ := fakeActor.CreateServiceInstanceArgsForCall(0) 156 Expect(brokerName).To(Equal("some-broker")) 157 }) 158 }) 159 160 When("the create is in progress", func() { 161 BeforeEach(func() { 162 fakeActor.CreateServiceInstanceReturns(v2action.ServiceInstance{LastOperation: ccv2.LastOperation{State: constant.LastOperationInProgress}}, []string{"a-warning", "another-warning"}, nil) 163 }) 164 165 It("displays a message indicating that create service is in progress", func() { 166 Expect(executeErr).NotTo(HaveOccurred()) 167 Expect(fakeActor.CreateServiceInstanceCallCount()).To(Equal(1)) 168 Expect(testUI.Out).To(Say("Creating service instance cool-service in org some-org / space some-space as some-user\\.\\.\\.")) 169 Expect(testUI.Out).To(Say("OK")) 170 Expect(testUI.Out).To(Say("Create in progress\\. Use 'cf services' or 'cf service cool-service' to check operation status\\.")) 171 }) 172 }) 173 }) 174 175 When("creating a service returns an error", func() { 176 BeforeEach(func() { 177 fakeActor.CreateServiceInstanceReturns(v2action.ServiceInstance{}, []string{"a-warning", "another-warning"}, errors.New("explode")) 178 }) 179 180 It("returns the error and displays all warnings", func() { 181 Expect(executeErr).To(MatchError("explode")) 182 Expect(fakeActor.CreateServiceInstanceCallCount()).To(Equal(1)) 183 184 Expect(testUI.Out).To(Say("Creating service instance cool-service in org some-org / space some-space as some-user\\.\\.\\.")) 185 Expect(testUI.Err).To(Say("a-warning")) 186 Expect(testUI.Err).To(Say("another-warning")) 187 }) 188 189 When("the service instance name is taken", func() { 190 BeforeEach(func() { 191 fakeActor.CreateServiceInstanceReturns(v2action.ServiceInstance{}, []string{"a-warning", "another-warning"}, ccerror.ServiceInstanceNameTakenError{}) 192 }) 193 194 It("succeeds, displaying warnings, 'OK' and an informative message", func() { 195 Expect(executeErr).NotTo(HaveOccurred()) 196 197 Expect(testUI.Err).To(Say("a-warning")) 198 Expect(testUI.Err).To(Say("another-warning")) 199 Expect(testUI.Out).To(Say("OK")) 200 Expect(testUI.Out).To(Say("Service cool-service already exists")) 201 }) 202 }) 203 }) 204 205 When("fetching the current user fails", func() { 206 BeforeEach(func() { 207 fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("explode")) 208 }) 209 210 It("returns an error", func() { 211 Expect(executeErr).To(MatchError("explode")) 212 }) 213 }) 214 }) 215 216 When("checking the target returns an error", func() { 217 BeforeEach(func() { 218 fakeSharedActor.CheckTargetReturns(errors.New("explode")) 219 }) 220 221 It("returns an error", func() { 222 Expect(executeErr).To(MatchError("explode")) 223 }) 224 }) 225 })