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