github.com/jenspinney/cli@v6.42.1-0.20190207184520-7450c600020e+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 = []string{"tag-1", "tag-2"} 121 }) 122 123 It("passes the tags as args when creating the service instance", func() { 124 Expect(executeErr).NotTo(HaveOccurred()) 125 Expect(fakeActor.CreateServiceInstanceCallCount()).To(Equal(1)) 126 _, _, _, _, _, _, tags := fakeActor.CreateServiceInstanceArgsForCall(0) 127 Expect(tags).To(Equal([]string{"tag-1", "tag-2"})) 128 }) 129 }) 130 131 Context("the user passes in parameters", func() { 132 BeforeEach(func() { 133 cmd.ParametersAsJSON = map[string]interface{}{ 134 "some-key": "some-value", 135 } 136 }) 137 138 It("passes the parameters as args when creating the service instance", func() { 139 Expect(executeErr).NotTo(HaveOccurred()) 140 Expect(fakeActor.CreateServiceInstanceCallCount()).To(Equal(1)) 141 _, _, _, _, _, params, _ := fakeActor.CreateServiceInstanceArgsForCall(0) 142 Expect(params).To(Equal(map[string]interface{}{"some-key": "some-value"})) 143 }) 144 }) 145 146 Context("the user passes in broker name", func() { 147 BeforeEach(func() { 148 cmd.ServiceBroker = "some-broker" 149 }) 150 151 It("passes the broker name as arg when creating the service instance", func() { 152 Expect(executeErr).NotTo(HaveOccurred()) 153 Expect(fakeActor.CreateServiceInstanceCallCount()).To(Equal(1)) 154 _, _, _, _, brokerName, _, _ := fakeActor.CreateServiceInstanceArgsForCall(0) 155 Expect(brokerName).To(Equal("some-broker")) 156 }) 157 }) 158 159 When("the create is in progress", func() { 160 BeforeEach(func() { 161 fakeActor.CreateServiceInstanceReturns(v2action.ServiceInstance{LastOperation: ccv2.LastOperation{State: constant.LastOperationInProgress}}, []string{"a-warning", "another-warning"}, nil) 162 }) 163 164 It("displays a message indicating that create service is in progress", func() { 165 Expect(executeErr).NotTo(HaveOccurred()) 166 Expect(fakeActor.CreateServiceInstanceCallCount()).To(Equal(1)) 167 Expect(testUI.Out).To(Say("Creating service instance cool-service in org some-org / space some-space as some-user\\.\\.\\.")) 168 Expect(testUI.Out).To(Say("OK")) 169 Expect(testUI.Out).To(Say("Create in progress\\. Use 'cf services' or 'cf service cool-service' to check operation status\\.")) 170 }) 171 }) 172 }) 173 174 When("creating a service returns an error", func() { 175 BeforeEach(func() { 176 fakeActor.CreateServiceInstanceReturns(v2action.ServiceInstance{}, []string{"a-warning", "another-warning"}, errors.New("explode")) 177 }) 178 179 It("returns the error and displays all warnings", func() { 180 Expect(executeErr).To(MatchError("explode")) 181 Expect(fakeActor.CreateServiceInstanceCallCount()).To(Equal(1)) 182 183 Expect(testUI.Out).To(Say("Creating service instance cool-service in org some-org / space some-space as some-user\\.\\.\\.")) 184 Expect(testUI.Err).To(Say("a-warning")) 185 Expect(testUI.Err).To(Say("another-warning")) 186 }) 187 188 When("the service instance name is taken", func() { 189 BeforeEach(func() { 190 fakeActor.CreateServiceInstanceReturns(v2action.ServiceInstance{}, []string{"a-warning", "another-warning"}, ccerror.ServiceInstanceNameTakenError{}) 191 }) 192 193 It("succeeds, displaying warnings, 'OK' and an informative message", func() { 194 Expect(executeErr).NotTo(HaveOccurred()) 195 196 Expect(testUI.Err).To(Say("a-warning")) 197 Expect(testUI.Err).To(Say("another-warning")) 198 Expect(testUI.Out).To(Say("OK")) 199 Expect(testUI.Out).To(Say("Service cool-service already exists")) 200 }) 201 }) 202 }) 203 204 When("fetching the current user fails", func() { 205 BeforeEach(func() { 206 fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("explode")) 207 }) 208 209 It("returns an error", func() { 210 Expect(executeErr).To(MatchError("explode")) 211 }) 212 }) 213 }) 214 215 When("checking the target returns an error", func() { 216 BeforeEach(func() { 217 fakeSharedActor.CheckTargetReturns(errors.New("explode")) 218 }) 219 220 It("returns an error", func() { 221 Expect(executeErr).To(MatchError("explode")) 222 }) 223 }) 224 })