github.com/LukasHeimann/cloudfoundrycli/v8@v8.4.4/command/v7/delete_service_key_command_test.go (about) 1 package v7_test 2 3 import ( 4 "github.com/LukasHeimann/cloudfoundrycli/v8/actor/actionerror" 5 "github.com/LukasHeimann/cloudfoundrycli/v8/actor/v7action" 6 "github.com/LukasHeimann/cloudfoundrycli/v8/cf/errors" 7 "github.com/LukasHeimann/cloudfoundrycli/v8/command/commandfakes" 8 "github.com/LukasHeimann/cloudfoundrycli/v8/command/translatableerror" 9 v7 "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("delete-service-key Command", func() { 19 var ( 20 cmd v7.DeleteServiceKeyCommand 21 input *Buffer 22 testUI *ui.UI 23 fakeConfig *commandfakes.FakeConfig 24 fakeSharedActor *commandfakes.FakeSharedActor 25 executeErr error 26 fakeActor *v7fakes.FakeActor 27 ) 28 29 const ( 30 fakeUserName = "fake-user-name" 31 fakeServiceInstanceName = "fake-service-instance-name" 32 fakeServiceKeyName = "fake-key-name" 33 fakeSpaceGUID = "fake-space-guid" 34 ) 35 36 BeforeEach(func() { 37 input = NewBuffer() 38 testUI = ui.NewTestUI(input, NewBuffer(), NewBuffer()) 39 fakeConfig = new(commandfakes.FakeConfig) 40 fakeSharedActor = new(commandfakes.FakeSharedActor) 41 fakeActor = new(v7fakes.FakeActor) 42 43 cmd = v7.DeleteServiceKeyCommand{ 44 BaseCommand: v7.BaseCommand{ 45 UI: testUI, 46 Config: fakeConfig, 47 SharedActor: fakeSharedActor, 48 Actor: fakeActor, 49 }, 50 } 51 52 fakeConfig.TargetedSpaceReturns(configv3.Space{GUID: fakeSpaceGUID}) 53 fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil) 54 55 fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns( 56 nil, 57 v7action.Warnings{"fake warning"}, 58 nil, 59 ) 60 61 setPositionalFlags(&cmd, fakeServiceInstanceName, fakeServiceKeyName) 62 setFlag(&cmd, "-f") 63 }) 64 65 JustBeforeEach(func() { 66 executeErr = cmd.Execute(nil) 67 }) 68 69 It("checks the user is logged in, and targeting an org and space", func() { 70 Expect(executeErr).NotTo(HaveOccurred()) 71 72 Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1)) 73 actualOrg, actualSpace := fakeSharedActor.CheckTargetArgsForCall(0) 74 Expect(actualOrg).To(BeTrue()) 75 Expect(actualSpace).To(BeTrue()) 76 }) 77 78 It("delegates to the actor", func() { 79 Expect(fakeActor.DeleteServiceKeyByServiceInstanceAndNameCallCount()).To(Equal(1)) 80 actualServiceInstanceName, actualKeyName, actualSpaceGUID := fakeActor.DeleteServiceKeyByServiceInstanceAndNameArgsForCall(0) 81 Expect(actualKeyName).To(Equal(fakeServiceKeyName)) 82 Expect(actualServiceInstanceName).To(Equal(fakeServiceInstanceName)) 83 Expect(actualSpaceGUID).To(Equal(fakeSpaceGUID)) 84 }) 85 86 Describe("intro message", func() { 87 It("prints an intro and warnings", func() { 88 Expect(executeErr).NotTo(HaveOccurred()) 89 Expect(testUI.Err).To(Say("fake warning")) 90 91 Expect(testUI.Out).To(Say( 92 `Deleting key %s for service instance %s as %s\.\.\.\n`, 93 fakeServiceKeyName, 94 fakeServiceInstanceName, 95 fakeUserName, 96 )) 97 }) 98 }) 99 100 Describe("prompting the user", func() { 101 BeforeEach(func() { 102 setFlag(&cmd, "-f", false) 103 }) 104 105 It("prompts the user", func() { 106 Expect(testUI.Out).To(Say(`Really delete the service key %s\? \[yN\]:`, fakeServiceKeyName)) 107 }) 108 109 When("user says no", func() { 110 BeforeEach(func() { 111 _, err := input.Write([]byte("n\n")) 112 Expect(err).NotTo(HaveOccurred()) 113 }) 114 115 It("does not call the actor", func() { 116 Expect(fakeActor.DeleteServiceKeyByServiceInstanceAndNameCallCount()).To(BeZero()) 117 }) 118 119 It("says the unbind was cancelled", func() { 120 Expect(executeErr).NotTo(HaveOccurred()) 121 Expect(testUI.Out).To(Say("Delete cancelled\n")) 122 }) 123 }) 124 125 When("user says yes", func() { 126 BeforeEach(func() { 127 _, err := input.Write([]byte("y\n")) 128 Expect(err).NotTo(HaveOccurred()) 129 }) 130 131 It("calls the actor", func() { 132 Expect(fakeActor.DeleteServiceKeyByServiceInstanceAndNameCallCount()).To(Equal(1)) 133 }) 134 }) 135 }) 136 137 When("service key not found", func() { 138 BeforeEach(func() { 139 fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns( 140 nil, 141 v7action.Warnings{"key warning"}, 142 actionerror.ServiceKeyNotFoundError{ 143 KeyName: fakeServiceKeyName, 144 ServiceInstanceName: fakeServiceInstanceName, 145 }, 146 ) 147 }) 148 149 It("succeeds with a message", func() { 150 Expect(testUI.Err).To(Say("key warning")) 151 Expect(executeErr).NotTo(HaveOccurred()) 152 Expect(testUI.Out).To(SatisfyAll( 153 Say(`\n`), 154 Say(`Service key %s does not exist for service instance %s\.\n`, fakeServiceKeyName, fakeServiceInstanceName), 155 Say(`OK\n`), 156 )) 157 }) 158 }) 159 160 When("service instance not found", func() { 161 BeforeEach(func() { 162 fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns( 163 nil, 164 v7action.Warnings{"instance warning"}, 165 actionerror.ServiceInstanceNotFoundError{Name: fakeServiceInstanceName}, 166 ) 167 }) 168 169 It("returns an appropriate error", func() { 170 Expect(testUI.Err).To(Say("instance warning")) 171 Expect(executeErr).To(MatchError(translatableerror.ServiceInstanceNotFoundError{ 172 Name: fakeServiceInstanceName, 173 })) 174 }) 175 }) 176 177 When("there is an error", func() { 178 BeforeEach(func() { 179 fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns( 180 nil, 181 v7action.Warnings{"bad warning"}, 182 errors.New("boom"), 183 ) 184 }) 185 186 It("returns the error", func() { 187 Expect(testUI.Err).To(Say("bad warning")) 188 Expect(executeErr).To(MatchError("boom")) 189 }) 190 }) 191 192 Describe("processing the response stream", func() { 193 Context("nil stream", func() { 194 It("prints a message and warnings", func() { 195 Expect(testUI.Out).To(Say(`OK\n`)) 196 Expect(testUI.Err).To(Say("fake warning")) 197 }) 198 }) 199 200 Context("stream goes to complete", func() { 201 BeforeEach(func() { 202 eventStream := make(chan v7action.PollJobEvent) 203 go func() { 204 eventStream <- v7action.PollJobEvent{ 205 State: v7action.JobProcessing, 206 Warnings: v7action.Warnings{"job processing warning"}, 207 } 208 eventStream <- v7action.PollJobEvent{ 209 State: v7action.JobComplete, 210 Warnings: v7action.Warnings{"job complete warning"}, 211 } 212 close(eventStream) 213 }() 214 215 fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns( 216 eventStream, 217 v7action.Warnings{"fake warning"}, 218 nil, 219 ) 220 }) 221 222 It("prints a message and warnings", func() { 223 Expect(testUI.Out).To(Say(`OK\n`)) 224 225 Expect(testUI.Err).To(SatisfyAll( 226 Say("fake warning"), 227 Say("job processing warning"), 228 Say("job complete warning"), 229 )) 230 }) 231 }) 232 233 Context("stream goes to polling", func() { 234 BeforeEach(func() { 235 eventStream := make(chan v7action.PollJobEvent) 236 go func() { 237 eventStream <- v7action.PollJobEvent{ 238 State: v7action.JobProcessing, 239 Warnings: v7action.Warnings{"job processing warning"}, 240 } 241 eventStream <- v7action.PollJobEvent{ 242 State: v7action.JobPolling, 243 Warnings: v7action.Warnings{"job polling warning"}, 244 } 245 }() 246 247 fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns( 248 eventStream, 249 v7action.Warnings{"fake warning"}, 250 nil, 251 ) 252 }) 253 254 It("prints a message and warnings", func() { 255 Expect(testUI.Out).To(SatisfyAll( 256 Say(`OK\n`), 257 Say(`\n`), 258 Say(`Delete in progress\.\n`), 259 )) 260 261 Expect(testUI.Err).To(SatisfyAll( 262 Say("fake warning"), 263 Say("job processing warning"), 264 Say("job polling warning"), 265 )) 266 }) 267 }) 268 269 Context("stream goes to error", func() { 270 BeforeEach(func() { 271 eventStream := make(chan v7action.PollJobEvent) 272 go func() { 273 eventStream <- v7action.PollJobEvent{ 274 State: v7action.JobFailed, 275 Warnings: v7action.Warnings{"job failed warning"}, 276 Err: errors.New("boom"), 277 } 278 }() 279 280 fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns( 281 eventStream, 282 v7action.Warnings{"fake warning"}, 283 nil, 284 ) 285 }) 286 287 It("prints warnings and returns the error", func() { 288 Expect(executeErr).To(MatchError("boom")) 289 290 Expect(testUI.Err).To(SatisfyAll( 291 Say("fake warning"), 292 Say("job failed warning"), 293 )) 294 }) 295 }) 296 297 When("--wait flag specified", func() { 298 BeforeEach(func() { 299 eventStream := make(chan v7action.PollJobEvent) 300 go func() { 301 eventStream <- v7action.PollJobEvent{ 302 State: v7action.JobProcessing, 303 Warnings: v7action.Warnings{"job processing warning"}, 304 } 305 eventStream <- v7action.PollJobEvent{ 306 State: v7action.JobPolling, 307 Warnings: v7action.Warnings{"job polling warning"}, 308 } 309 eventStream <- v7action.PollJobEvent{ 310 State: v7action.JobComplete, 311 Warnings: v7action.Warnings{"job complete warning"}, 312 } 313 close(eventStream) 314 }() 315 316 fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns( 317 eventStream, 318 v7action.Warnings{"fake warning"}, 319 nil, 320 ) 321 322 setFlag(&cmd, "--wait") 323 }) 324 325 It("waits for the event stream to complete", func() { 326 Expect(testUI.Out).To(SatisfyAll( 327 Say(`Waiting for the operation to complete\.\.\.\n`), 328 Say(`\n`), 329 Say(`OK\n`), 330 )) 331 332 Expect(testUI.Err).To(SatisfyAll( 333 Say("fake warning"), 334 Say("job processing warning"), 335 Say("job polling warning"), 336 Say("job complete warning"), 337 )) 338 }) 339 }) 340 }) 341 342 When("checking the target returns an error", func() { 343 BeforeEach(func() { 344 fakeSharedActor.CheckTargetReturns(errors.New("explode")) 345 }) 346 347 It("returns the error", func() { 348 Expect(executeErr).To(MatchError("explode")) 349 }) 350 }) 351 352 When("getting the username returns an error", func() { 353 BeforeEach(func() { 354 fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("bad thing")) 355 }) 356 357 It("returns the error", func() { 358 Expect(executeErr).To(MatchError("bad thing")) 359 }) 360 }) 361 })