github.com/randomtask1155/cli@v6.41.1-0.20181227003417-a98eed78cbde+incompatible/command/v6/v3_apps_command_test.go (about) 1 package v6_test 2 3 import ( 4 "errors" 5 6 "code.cloudfoundry.org/cli/actor/actionerror" 7 "code.cloudfoundry.org/cli/actor/v2action" 8 "code.cloudfoundry.org/cli/actor/v3action" 9 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 10 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" 11 "code.cloudfoundry.org/cli/api/cloudcontroller/ccversion" 12 "code.cloudfoundry.org/cli/command/commandfakes" 13 "code.cloudfoundry.org/cli/command/translatableerror" 14 . "code.cloudfoundry.org/cli/command/v6" 15 "code.cloudfoundry.org/cli/command/v6/shared/sharedfakes" 16 "code.cloudfoundry.org/cli/command/v6/v6fakes" 17 "code.cloudfoundry.org/cli/util/configv3" 18 "code.cloudfoundry.org/cli/util/ui" 19 . "github.com/onsi/ginkgo" 20 . "github.com/onsi/gomega" 21 . "github.com/onsi/gomega/gbytes" 22 ) 23 24 var _ = Describe("v3-apps Command", func() { 25 var ( 26 cmd V3AppsCommand 27 testUI *ui.UI 28 fakeConfig *commandfakes.FakeConfig 29 fakeSharedActor *commandfakes.FakeSharedActor 30 fakeActor *v6fakes.FakeV3AppsActor 31 fakeV2Actor *sharedfakes.FakeV2AppActor 32 binaryName string 33 executeErr error 34 ) 35 36 BeforeEach(func() { 37 testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer()) 38 fakeConfig = new(commandfakes.FakeConfig) 39 fakeSharedActor = new(commandfakes.FakeSharedActor) 40 fakeActor = new(v6fakes.FakeV3AppsActor) 41 fakeV2Actor = new(sharedfakes.FakeV2AppActor) 42 43 binaryName = "faceman" 44 fakeConfig.BinaryNameReturns(binaryName) 45 46 cmd = V3AppsCommand{ 47 UI: testUI, 48 Config: fakeConfig, 49 Actor: fakeActor, 50 V2AppActor: fakeV2Actor, 51 SharedActor: fakeSharedActor, 52 } 53 54 fakeConfig.TargetedOrganizationReturns(configv3.Organization{ 55 Name: "some-org", 56 GUID: "some-org-guid", 57 }) 58 fakeConfig.TargetedSpaceReturns(configv3.Space{ 59 Name: "some-space", 60 GUID: "some-space-guid", 61 }) 62 63 fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) 64 }) 65 66 JustBeforeEach(func() { 67 executeErr = cmd.Execute(nil) 68 }) 69 70 When("the API version is below the minimum", func() { 71 BeforeEach(func() { 72 fakeActor.CloudControllerAPIVersionReturns(ccversion.MinV3ClientVersion) 73 }) 74 75 It("returns a MinimumAPIVersionNotMetError", func() { 76 Expect(executeErr).To(MatchError(translatableerror.MinimumCFAPIVersionNotMetError{ 77 CurrentVersion: ccversion.MinV3ClientVersion, 78 MinimumVersion: ccversion.MinVersionApplicationFlowV3, 79 })) 80 }) 81 82 It("displays the experimental warning", func() { 83 Expect(testUI.Err).To(Say("This command is in EXPERIMENTAL stage and may change without notice")) 84 }) 85 }) 86 87 When("checking target fails", func() { 88 BeforeEach(func() { 89 fakeActor.CloudControllerAPIVersionReturns(ccversion.MinVersionApplicationFlowV3) 90 fakeSharedActor.CheckTargetReturns(actionerror.NoOrganizationTargetedError{BinaryName: binaryName}) 91 }) 92 93 It("returns an error", func() { 94 Expect(executeErr).To(MatchError(actionerror.NoOrganizationTargetedError{BinaryName: binaryName})) 95 96 Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1)) 97 checkTargetedOrg, checkTargetedSpace := fakeSharedActor.CheckTargetArgsForCall(0) 98 Expect(checkTargetedOrg).To(BeTrue()) 99 Expect(checkTargetedSpace).To(BeTrue()) 100 }) 101 }) 102 103 When("the user is not logged in", func() { 104 var expectedErr error 105 106 BeforeEach(func() { 107 fakeActor.CloudControllerAPIVersionReturns(ccversion.MinVersionApplicationFlowV3) 108 expectedErr = errors.New("some current user error") 109 fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) 110 }) 111 112 It("return an error", func() { 113 Expect(executeErr).To(Equal(expectedErr)) 114 }) 115 }) 116 117 When("getting the applications returns an error", func() { 118 var expectedErr error 119 120 BeforeEach(func() { 121 fakeActor.CloudControllerAPIVersionReturns(ccversion.MinVersionApplicationFlowV3) 122 expectedErr = ccerror.RequestError{} 123 fakeActor.GetApplicationsWithProcessesBySpaceReturns([]v3action.ApplicationWithProcessSummary{}, v3action.Warnings{"warning-1", "warning-2"}, expectedErr) 124 }) 125 126 It("returns the error and prints warnings", func() { 127 Expect(executeErr).To(Equal(ccerror.RequestError{})) 128 129 Expect(testUI.Out).To(Say(`Getting apps in org some-org / space some-space as steve\.\.\.`)) 130 131 Expect(testUI.Err).To(Say("warning-1")) 132 Expect(testUI.Err).To(Say("warning-2")) 133 }) 134 }) 135 136 When("getting routes returns an error", func() { 137 var expectedErr error 138 139 BeforeEach(func() { 140 fakeActor.CloudControllerAPIVersionReturns(ccversion.MinVersionApplicationFlowV3) 141 expectedErr = ccerror.RequestError{} 142 fakeActor.GetApplicationsWithProcessesBySpaceReturns([]v3action.ApplicationWithProcessSummary{ 143 { 144 Application: v3action.Application{ 145 GUID: "app-guid", 146 Name: "some-app", 147 State: constant.ApplicationStarted, 148 }, 149 ProcessSummaries: []v3action.ProcessSummary{{Process: v3action.Process{Type: "process-type"}}}, 150 }, 151 }, v3action.Warnings{"warning-1", "warning-2"}, nil) 152 153 fakeV2Actor.GetApplicationRoutesReturns([]v2action.Route{}, v2action.Warnings{"route-warning-1", "route-warning-2"}, expectedErr) 154 }) 155 156 It("returns the error and prints warnings", func() { 157 Expect(executeErr).To(Equal(ccerror.RequestError{})) 158 159 Expect(testUI.Out).To(Say(`Getting apps in org some-org / space some-space as steve\.\.\.`)) 160 161 Expect(testUI.Err).To(Say("warning-1")) 162 Expect(testUI.Err).To(Say("warning-2")) 163 Expect(testUI.Err).To(Say("route-warning-1")) 164 Expect(testUI.Err).To(Say("route-warning-2")) 165 }) 166 }) 167 168 When("the route actor does not return any errors", func() { 169 BeforeEach(func() { 170 fakeActor.CloudControllerAPIVersionReturns(ccversion.MinVersionApplicationFlowV3) 171 fakeV2Actor.GetApplicationRoutesStub = func(appGUID string) (v2action.Routes, v2action.Warnings, error) { 172 switch appGUID { 173 case "app-guid-1": 174 return []v2action.Route{ 175 { 176 Host: "some-app-1", 177 Domain: v2action.Domain{Name: "some-other-domain"}, 178 }, 179 { 180 Host: "some-app-1", 181 Domain: v2action.Domain{Name: "some-domain"}, 182 }, 183 }, 184 v2action.Warnings{"route-warning-1", "route-warning-2"}, 185 nil 186 case "app-guid-2": 187 return []v2action.Route{ 188 { 189 Host: "some-app-2", 190 Domain: v2action.Domain{Name: "some-domain"}, 191 }, 192 }, 193 v2action.Warnings{"route-warning-3", "route-warning-4"}, 194 nil 195 default: 196 panic("unknown app guid") 197 } 198 } 199 }) 200 201 Context("with existing apps", func() { 202 BeforeEach(func() { 203 appSummaries := []v3action.ApplicationWithProcessSummary{ 204 { 205 Application: v3action.Application{ 206 GUID: "app-guid-1", 207 Name: "some-app-1", 208 State: constant.ApplicationStarted, 209 }, 210 ProcessSummaries: []v3action.ProcessSummary{ 211 { 212 Process: v3action.Process{ 213 Type: "console", 214 }, 215 InstanceDetails: []v3action.ProcessInstance{}, 216 }, 217 { 218 Process: v3action.Process{ 219 Type: "worker", 220 }, 221 InstanceDetails: []v3action.ProcessInstance{ 222 { 223 Index: 0, 224 State: constant.ProcessInstanceDown, 225 }, 226 }, 227 }, 228 { 229 Process: v3action.Process{ 230 Type: constant.ProcessTypeWeb, 231 }, 232 InstanceDetails: []v3action.ProcessInstance{ 233 v3action.ProcessInstance{ 234 Index: 0, 235 State: constant.ProcessInstanceRunning, 236 }, 237 v3action.ProcessInstance{ 238 Index: 1, 239 State: constant.ProcessInstanceRunning, 240 }, 241 }, 242 }, 243 }, 244 }, 245 { 246 Application: v3action.Application{ 247 GUID: "app-guid-2", 248 Name: "some-app-2", 249 State: constant.ApplicationStopped, 250 }, 251 ProcessSummaries: []v3action.ProcessSummary{ 252 { 253 Process: v3action.Process{ 254 Type: constant.ProcessTypeWeb, 255 }, 256 InstanceDetails: []v3action.ProcessInstance{ 257 v3action.ProcessInstance{ 258 Index: 0, 259 State: constant.ProcessInstanceDown, 260 }, 261 v3action.ProcessInstance{ 262 Index: 1, 263 State: constant.ProcessInstanceDown, 264 }, 265 }, 266 }, 267 }, 268 }, 269 } 270 fakeActor.GetApplicationsWithProcessesBySpaceReturns(appSummaries, v3action.Warnings{"warning-1", "warning-2"}, nil) 271 }) 272 273 It("prints the application summary and outputs warnings", func() { 274 Expect(executeErr).ToNot(HaveOccurred()) 275 276 Expect(testUI.Out).To(Say(`Getting apps in org some-org / space some-space as steve\.\.\.`)) 277 278 Expect(testUI.Out).To(Say(`name\s+requested state\s+processes\s+routes`)) 279 Expect(testUI.Out).To(Say(`some-app-1\s+started\s+web:2/2, console:0/0, worker:0/1\s+some-app-1.some-other-domain, some-app-1.some-domain`)) 280 Expect(testUI.Out).To(Say(`some-app-2\s+stopped\s+web:0/2\s+some-app-2.some-domain`)) 281 282 Expect(testUI.Err).To(Say("warning-1")) 283 Expect(testUI.Err).To(Say("warning-2")) 284 285 Expect(testUI.Err).To(Say("route-warning-1")) 286 Expect(testUI.Err).To(Say("route-warning-2")) 287 Expect(testUI.Err).To(Say("route-warning-3")) 288 Expect(testUI.Err).To(Say("route-warning-4")) 289 290 Expect(fakeActor.GetApplicationsWithProcessesBySpaceCallCount()).To(Equal(1)) 291 spaceGUID := fakeActor.GetApplicationsWithProcessesBySpaceArgsForCall(0) 292 Expect(spaceGUID).To(Equal("some-space-guid")) 293 294 Expect(fakeV2Actor.GetApplicationRoutesCallCount()).To(Equal(2)) 295 appGUID := fakeV2Actor.GetApplicationRoutesArgsForCall(0) 296 Expect(appGUID).To(Equal("app-guid-1")) 297 appGUID = fakeV2Actor.GetApplicationRoutesArgsForCall(1) 298 Expect(appGUID).To(Equal("app-guid-2")) 299 }) 300 }) 301 302 When("app does not have processes", func() { 303 BeforeEach(func() { 304 appSummaries := []v3action.ApplicationWithProcessSummary{ 305 { 306 Application: v3action.Application{ 307 GUID: "app-guid", 308 Name: "some-app", 309 State: constant.ApplicationStarted, 310 }, 311 ProcessSummaries: []v3action.ProcessSummary{}, 312 }, 313 } 314 fakeActor.GetApplicationsWithProcessesBySpaceReturns(appSummaries, v3action.Warnings{"warning"}, nil) 315 }) 316 317 It("it does not request or display routes information for app", func() { 318 Expect(executeErr).ToNot(HaveOccurred()) 319 320 Expect(testUI.Out).To(Say(`Getting apps in org some-org / space some-space as steve\.\.\.`)) 321 322 Expect(testUI.Out).To(Say(`name\s+requested state\s+processes\s+routes`)) 323 Expect(testUI.Out).To(Say(`some-app\s+started\s+$`)) 324 Expect(testUI.Err).To(Say("warning")) 325 326 Expect(fakeActor.GetApplicationsWithProcessesBySpaceCallCount()).To(Equal(1)) 327 spaceGUID := fakeActor.GetApplicationsWithProcessesBySpaceArgsForCall(0) 328 Expect(spaceGUID).To(Equal("some-space-guid")) 329 330 Expect(fakeV2Actor.GetApplicationRoutesCallCount()).To(Equal(0)) 331 }) 332 }) 333 334 Context("with no apps", func() { 335 BeforeEach(func() { 336 fakeActor.GetApplicationsWithProcessesBySpaceReturns([]v3action.ApplicationWithProcessSummary{}, v3action.Warnings{"warning-1", "warning-2"}, nil) 337 }) 338 339 It("displays there are no apps", func() { 340 Expect(executeErr).ToNot(HaveOccurred()) 341 342 Expect(testUI.Out).To(Say(`Getting apps in org some-org / space some-space as steve\.\.\.`)) 343 Expect(testUI.Out).To(Say("No apps found")) 344 }) 345 }) 346 }) 347 })