github.com/LukasHeimann/cloudfoundrycli/v8@v8.4.4/command/v7/unbind_service_command_test.go (about) 1 package v7_test 2 3 import ( 4 "errors" 5 6 "github.com/LukasHeimann/cloudfoundrycli/v8/actor/actionerror" 7 "github.com/LukasHeimann/cloudfoundrycli/v8/actor/v7action" 8 "github.com/LukasHeimann/cloudfoundrycli/v8/command/commandfakes" 9 "github.com/LukasHeimann/cloudfoundrycli/v8/command/v7" 10 "github.com/LukasHeimann/cloudfoundrycli/v8/command/v7/v7fakes" 11 "github.com/LukasHeimann/cloudfoundrycli/v8/util/configv3" 12 "github.com/LukasHeimann/cloudfoundrycli/v8/util/ui" 13 . "github.com/onsi/ginkgo" 14 . "github.com/onsi/gomega" 15 . "github.com/onsi/gomega/gbytes" 16 ) 17 18 var _ = Describe("unbind-service Command", func() { 19 var ( 20 cmd v7.UnbindServiceCommand 21 testUI *ui.UI 22 fakeConfig *commandfakes.FakeConfig 23 fakeSharedActor *commandfakes.FakeSharedActor 24 executeErr error 25 fakeActor *v7fakes.FakeActor 26 ) 27 28 const ( 29 fakeUserName = "fake-user-name" 30 fakeServiceInstanceName = "fake-service-instance-name" 31 fakeAppName = "fake-app-name" 32 fakeOrgName = "fake-org-name" 33 fakeSpaceName = "fake-space-name" 34 fakeSpaceGUID = "fake-space-guid" 35 ) 36 37 BeforeEach(func() { 38 testUI = ui.NewTestUI(NewBuffer(), NewBuffer(), NewBuffer()) 39 fakeConfig = new(commandfakes.FakeConfig) 40 fakeSharedActor = new(commandfakes.FakeSharedActor) 41 fakeActor = new(v7fakes.FakeActor) 42 43 cmd = v7.UnbindServiceCommand{ 44 BaseCommand: v7.BaseCommand{ 45 UI: testUI, 46 Config: fakeConfig, 47 SharedActor: fakeSharedActor, 48 Actor: fakeActor, 49 }, 50 } 51 52 fakeConfig.TargetedSpaceReturns(configv3.Space{ 53 Name: fakeSpaceName, 54 GUID: fakeSpaceGUID, 55 }) 56 57 fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: fakeOrgName}) 58 59 fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil) 60 61 fakeActor.DeleteServiceAppBindingReturns( 62 nil, 63 v7action.Warnings{"fake warning"}, 64 nil, 65 ) 66 67 setPositionalFlags(&cmd, fakeAppName, fakeServiceInstanceName) 68 }) 69 70 JustBeforeEach(func() { 71 executeErr = cmd.Execute(nil) 72 }) 73 74 It("checks the user is logged in, and targeting an org and space", func() { 75 Expect(executeErr).NotTo(HaveOccurred()) 76 77 Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1)) 78 actualOrg, actualSpace := fakeSharedActor.CheckTargetArgsForCall(0) 79 Expect(actualOrg).To(BeTrue()) 80 Expect(actualSpace).To(BeTrue()) 81 }) 82 83 It("delegates to the actor", func() { 84 Expect(fakeActor.DeleteServiceAppBindingCallCount()).To(Equal(1)) 85 Expect(fakeActor.DeleteServiceAppBindingArgsForCall(0)).To(Equal(v7action.DeleteServiceAppBindingParams{ 86 SpaceGUID: fakeSpaceGUID, 87 ServiceInstanceName: fakeServiceInstanceName, 88 AppName: fakeAppName, 89 })) 90 }) 91 92 Describe("intro message", func() { 93 It("prints an intro and warnings", func() { 94 Expect(executeErr).NotTo(HaveOccurred()) 95 Expect(testUI.Err).To(Say("fake warning")) 96 97 Expect(testUI.Out).To(Say( 98 `Unbinding app %s from service %s in org %s / space %s as %s\.\.\.\n`, 99 fakeAppName, 100 fakeServiceInstanceName, 101 fakeOrgName, 102 fakeSpaceName, 103 fakeUserName, 104 )) 105 }) 106 }) 107 108 When("binding did not exist", func() { 109 BeforeEach(func() { 110 fakeActor.DeleteServiceAppBindingReturns( 111 nil, 112 v7action.Warnings{"fake warning"}, 113 actionerror.ServiceBindingNotFoundError{}, 114 ) 115 }) 116 117 It("prints a message and warnings", func() { 118 Expect(testUI.Out).To(SatisfyAll( 119 Say( 120 `Binding between %s and %s did not exist\n`, 121 fakeServiceInstanceName, 122 fakeAppName, 123 ), 124 Say(`OK\n`), 125 )) 126 127 Expect(testUI.Err).To(Say("fake warning")) 128 }) 129 }) 130 131 Describe("processing the response stream", func() { 132 Context("nil stream", func() { 133 It("prints a message and warnings", func() { 134 Expect(testUI.Out).To(Say(`OK\n`)) 135 Expect(testUI.Err).To(Say("fake warning")) 136 }) 137 }) 138 139 Context("stream goes to complete", func() { 140 BeforeEach(func() { 141 eventStream := make(chan v7action.PollJobEvent) 142 go func() { 143 eventStream <- v7action.PollJobEvent{ 144 State: v7action.JobProcessing, 145 Warnings: v7action.Warnings{"job processing warning"}, 146 } 147 eventStream <- v7action.PollJobEvent{ 148 State: v7action.JobComplete, 149 Warnings: v7action.Warnings{"job complete warning"}, 150 } 151 close(eventStream) 152 }() 153 154 fakeActor.DeleteServiceAppBindingReturns( 155 eventStream, 156 v7action.Warnings{"fake warning"}, 157 nil, 158 ) 159 }) 160 161 It("prints a message and warnings", func() { 162 Expect(testUI.Out).To(Say(`OK\n`)) 163 164 Expect(testUI.Err).To(SatisfyAll( 165 Say("fake warning"), 166 Say("job processing warning"), 167 Say("job complete warning"), 168 )) 169 }) 170 }) 171 172 Context("stream goes to polling", func() { 173 BeforeEach(func() { 174 eventStream := make(chan v7action.PollJobEvent) 175 go func() { 176 eventStream <- v7action.PollJobEvent{ 177 State: v7action.JobProcessing, 178 Warnings: v7action.Warnings{"job processing warning"}, 179 } 180 eventStream <- v7action.PollJobEvent{ 181 State: v7action.JobPolling, 182 Warnings: v7action.Warnings{"job polling warning"}, 183 } 184 }() 185 186 fakeActor.DeleteServiceAppBindingReturns( 187 eventStream, 188 v7action.Warnings{"fake warning"}, 189 nil, 190 ) 191 }) 192 193 It("prints a message and warnings", func() { 194 Expect(testUI.Out).To(SatisfyAll( 195 Say(`OK\n`), 196 Say(`\n`), 197 Say(`Unbinding in progress. Use 'cf service %s' to check operation status.\n`, fakeServiceInstanceName), 198 )) 199 200 Expect(testUI.Err).To(SatisfyAll( 201 Say("fake warning"), 202 Say("job processing warning"), 203 Say("job polling warning"), 204 )) 205 }) 206 }) 207 208 Context("stream goes to error", func() { 209 BeforeEach(func() { 210 eventStream := make(chan v7action.PollJobEvent) 211 go func() { 212 eventStream <- v7action.PollJobEvent{ 213 State: v7action.JobFailed, 214 Warnings: v7action.Warnings{"job failed warning"}, 215 Err: errors.New("boom"), 216 } 217 }() 218 219 fakeActor.DeleteServiceAppBindingReturns( 220 eventStream, 221 v7action.Warnings{"fake warning"}, 222 nil, 223 ) 224 }) 225 226 It("prints warnings and returns the error", func() { 227 Expect(executeErr).To(MatchError("boom")) 228 229 Expect(testUI.Err).To(SatisfyAll( 230 Say("fake warning"), 231 Say("job failed warning"), 232 )) 233 }) 234 }) 235 236 When("--wait flag specified", func() { 237 BeforeEach(func() { 238 eventStream := make(chan v7action.PollJobEvent) 239 go func() { 240 eventStream <- v7action.PollJobEvent{ 241 State: v7action.JobProcessing, 242 Warnings: v7action.Warnings{"job processing warning"}, 243 } 244 eventStream <- v7action.PollJobEvent{ 245 State: v7action.JobPolling, 246 Warnings: v7action.Warnings{"job polling warning"}, 247 } 248 eventStream <- v7action.PollJobEvent{ 249 State: v7action.JobComplete, 250 Warnings: v7action.Warnings{"job complete warning"}, 251 } 252 close(eventStream) 253 }() 254 255 fakeActor.DeleteServiceAppBindingReturns( 256 eventStream, 257 v7action.Warnings{"fake warning"}, 258 nil, 259 ) 260 261 setFlag(&cmd, "--wait") 262 }) 263 264 It("waits for the event stream to complete", func() { 265 Expect(testUI.Out).To(SatisfyAll( 266 Say(`Waiting for the operation to complete\.\.\.\n`), 267 Say(`\n`), 268 Say(`OK\n`), 269 )) 270 271 Expect(testUI.Err).To(SatisfyAll( 272 Say("fake warning"), 273 Say("job processing warning"), 274 Say("job polling warning"), 275 Say("job complete warning"), 276 )) 277 }) 278 }) 279 }) 280 281 When("checking the target returns an error", func() { 282 BeforeEach(func() { 283 fakeSharedActor.CheckTargetReturns(errors.New("explode")) 284 }) 285 286 It("returns the error", func() { 287 Expect(executeErr).To(MatchError("explode")) 288 }) 289 }) 290 291 When("actor returns error", func() { 292 BeforeEach(func() { 293 fakeActor.DeleteServiceAppBindingReturns( 294 nil, 295 v7action.Warnings{"fake warning"}, 296 errors.New("boom"), 297 ) 298 }) 299 300 It("prints warnings and returns the error", func() { 301 Expect(testUI.Err).To(Say("fake warning")) 302 Expect(executeErr).To(MatchError("boom")) 303 }) 304 }) 305 306 When("getting the username returns an error", func() { 307 BeforeEach(func() { 308 fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("bad thing")) 309 }) 310 311 It("returns the error", func() { 312 Expect(executeErr).To(MatchError("bad thing")) 313 }) 314 }) 315 })