github.com/cloudfoundry-attic/cli-with-i18n@v6.32.1-0.20171002233121-7401370d3b85+incompatible/command/v3/v3_stop_command_test.go (about) 1 package v3_test 2 3 import ( 4 "errors" 5 6 "code.cloudfoundry.org/cli/actor/sharedaction" 7 "code.cloudfoundry.org/cli/actor/v3action" 8 "code.cloudfoundry.org/cli/api/cloudcontroller/ccversion" 9 "code.cloudfoundry.org/cli/command/commandfakes" 10 "code.cloudfoundry.org/cli/command/flag" 11 "code.cloudfoundry.org/cli/command/translatableerror" 12 "code.cloudfoundry.org/cli/command/v3" 13 "code.cloudfoundry.org/cli/command/v3/v3fakes" 14 "code.cloudfoundry.org/cli/util/configv3" 15 "code.cloudfoundry.org/cli/util/ui" 16 . "github.com/onsi/ginkgo" 17 . "github.com/onsi/gomega" 18 . "github.com/onsi/gomega/gbytes" 19 ) 20 21 var _ = Describe("v3-stop Command", func() { 22 var ( 23 cmd v3.V3StopCommand 24 testUI *ui.UI 25 fakeConfig *commandfakes.FakeConfig 26 fakeSharedActor *commandfakes.FakeSharedActor 27 fakeActor *v3fakes.FakeV3StopActor 28 binaryName string 29 executeErr error 30 app 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(v3fakes.FakeV3StopActor) 38 39 binaryName = "faceman" 40 fakeConfig.BinaryNameReturns(binaryName) 41 app = "some-app" 42 43 cmd = v3.V3StopCommand{ 44 RequiredArgs: flag.AppName{AppName: app}, 45 46 UI: testUI, 47 Config: fakeConfig, 48 SharedActor: fakeSharedActor, 49 Actor: fakeActor, 50 } 51 52 fakeActor.CloudControllerAPIVersionReturns(ccversion.MinVersionV3) 53 }) 54 55 JustBeforeEach(func() { 56 executeErr = cmd.Execute(nil) 57 }) 58 59 Context("when the API version is below the minimum", func() { 60 BeforeEach(func() { 61 fakeActor.CloudControllerAPIVersionReturns("0.0.0") 62 }) 63 64 It("returns a MinimumAPIVersionNotMetError", func() { 65 Expect(executeErr).To(MatchError(translatableerror.MinimumAPIVersionNotMetError{ 66 CurrentVersion: "0.0.0", 67 MinimumVersion: ccversion.MinVersionV3, 68 })) 69 }) 70 }) 71 72 Context("when checking target fails", func() { 73 BeforeEach(func() { 74 fakeSharedActor.CheckTargetReturns(sharedaction.NoOrganizationTargetedError{BinaryName: binaryName}) 75 }) 76 77 It("returns an error", func() { 78 Expect(executeErr).To(MatchError(translatableerror.NoOrganizationTargetedError{BinaryName: binaryName})) 79 80 Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1)) 81 _, checkTargetedOrg, checkTargetedSpace := fakeSharedActor.CheckTargetArgsForCall(0) 82 Expect(checkTargetedOrg).To(BeTrue()) 83 Expect(checkTargetedSpace).To(BeTrue()) 84 }) 85 }) 86 87 Context("when the user is not logged in", func() { 88 var expectedErr error 89 90 BeforeEach(func() { 91 expectedErr = errors.New("some current user error") 92 fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) 93 }) 94 95 It("return an error", func() { 96 Expect(executeErr).To(Equal(expectedErr)) 97 }) 98 }) 99 100 Context("when the actor does not return an error", func() { 101 BeforeEach(func() { 102 fakeConfig.TargetedOrganizationReturns(configv3.Organization{ 103 Name: "some-org", 104 }) 105 fakeConfig.TargetedSpaceReturns(configv3.Space{ 106 Name: "some-space", 107 GUID: "some-space-guid", 108 }) 109 fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) 110 fakeActor.GetApplicationByNameAndSpaceReturns(v3action.Application{GUID: "some-app-guid", State: "STARTED"}, v3action.Warnings{"get-warning-1", "get-warning-2"}, nil) 111 fakeActor.StopApplicationReturns(v3action.Warnings{"stop-warning-1", "stop-warning-2"}, nil) 112 }) 113 114 It("says that the app was stopped and outputs warnings", func() { 115 Expect(executeErr).ToNot(HaveOccurred()) 116 117 Expect(testUI.Out).To(Say("Stopping app some-app in org some-org / space some-space as steve\\.\\.\\.")) 118 119 Expect(testUI.Err).To(Say("get-warning-1")) 120 Expect(testUI.Err).To(Say("get-warning-2")) 121 Expect(testUI.Err).To(Say("stop-warning-1")) 122 Expect(testUI.Err).To(Say("stop-warning-2")) 123 Expect(testUI.Out).To(Say("OK")) 124 125 Expect(fakeActor.StopApplicationCallCount()).To(Equal(1)) 126 appGUID := fakeActor.StopApplicationArgsForCall(0) 127 Expect(appGUID).To(Equal("some-app-guid")) 128 }) 129 }) 130 131 Context("when the get app call returns a ApplicationNotFoundError", func() { 132 var expectedErr error 133 134 BeforeEach(func() { 135 fakeConfig.TargetedOrganizationReturns(configv3.Organization{ 136 Name: "some-org", 137 }) 138 fakeConfig.TargetedSpaceReturns(configv3.Space{ 139 Name: "some-space", 140 }) 141 fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) 142 expectedErr = v3action.ApplicationNotFoundError{Name: app} 143 fakeActor.GetApplicationByNameAndSpaceReturns(v3action.Application{State: "STARTED"}, v3action.Warnings{"get-warning-1", "get-warning-2"}, expectedErr) 144 }) 145 146 It("says that the app failed to stop", func() { 147 Expect(executeErr).To(Equal(translatableerror.ApplicationNotFoundError{Name: app})) 148 Expect(testUI.Out).ToNot(Say("Stopping")) 149 150 Expect(testUI.Err).To(Say("get-warning-1")) 151 Expect(testUI.Err).To(Say("get-warning-2")) 152 }) 153 }) 154 155 Context("when the stop app call returns a ApplicationNotFoundError (someone else deleted app after we fetched summary)", func() { 156 var expectedErr error 157 158 BeforeEach(func() { 159 fakeConfig.TargetedOrganizationReturns(configv3.Organization{ 160 Name: "some-org", 161 }) 162 fakeConfig.TargetedSpaceReturns(configv3.Space{ 163 Name: "some-space", 164 }) 165 fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) 166 fakeActor.GetApplicationByNameAndSpaceReturns(v3action.Application{State: "STARTED"}, v3action.Warnings{"get-warning-1", "get-warning-2"}, nil) 167 expectedErr = v3action.ApplicationNotFoundError{Name: app} 168 fakeActor.StopApplicationReturns(v3action.Warnings{"stop-warning-1", "stop-warning-2"}, expectedErr) 169 }) 170 171 It("says that the app failed to stop", func() { 172 Expect(executeErr).To(Equal(translatableerror.ApplicationNotFoundError{Name: app})) 173 Expect(testUI.Out).To(Say("Stopping app some-app in org some-org / space some-space as steve\\.\\.\\.")) 174 175 Expect(testUI.Err).To(Say("get-warning-1")) 176 Expect(testUI.Err).To(Say("get-warning-2")) 177 Expect(testUI.Err).To(Say("stop-warning-1")) 178 Expect(testUI.Err).To(Say("stop-warning-2")) 179 }) 180 }) 181 182 Context("when the app is already stopped", func() { 183 BeforeEach(func() { 184 fakeConfig.TargetedOrganizationReturns(configv3.Organization{ 185 Name: "some-org", 186 }) 187 fakeConfig.TargetedSpaceReturns(configv3.Space{ 188 Name: "some-space", 189 }) 190 fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) 191 fakeActor.GetApplicationByNameAndSpaceReturns(v3action.Application{State: "STOPPED"}, v3action.Warnings{"get-warning-1", "get-warning-2"}, nil) 192 }) 193 194 It("says that the app failed to stop", func() { 195 Expect(executeErr).ToNot(HaveOccurred()) 196 Expect(testUI.Out).ToNot(Say("Stopping")) 197 Expect(testUI.Out).To(Say("OK")) 198 199 Expect(testUI.Err).To(Say("get-warning-1")) 200 Expect(testUI.Err).To(Say("get-warning-2")) 201 Expect(testUI.Err).To(Say("App some-app is already stopped")) 202 203 Expect(fakeActor.StopApplicationCallCount()).To(BeZero(), "Expected StopApplication to not be called") 204 }) 205 }) 206 207 Context("when the get application returns an unknown error", func() { 208 var expectedErr error 209 210 BeforeEach(func() { 211 fakeConfig.TargetedOrganizationReturns(configv3.Organization{ 212 Name: "some-org", 213 }) 214 fakeConfig.TargetedSpaceReturns(configv3.Space{ 215 Name: "some-space", 216 }) 217 fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) 218 expectedErr = errors.New("some-error") 219 fakeActor.GetApplicationByNameAndSpaceReturns(v3action.Application{State: "STARTED"}, v3action.Warnings{"get-warning-1", "get-warning-2"}, expectedErr) 220 }) 221 222 It("says that the app failed to stop", func() { 223 Expect(executeErr).To(Equal(expectedErr)) 224 Expect(testUI.Out).ToNot(Say("Stopping")) 225 226 Expect(testUI.Err).To(Say("get-warning-1")) 227 Expect(testUI.Err).To(Say("get-warning-2")) 228 229 Expect(fakeActor.StopApplicationCallCount()).To(BeZero(), "Expected StopApplication to not be called") 230 }) 231 }) 232 233 Context("when the stop application returns an unknown error", func() { 234 var expectedErr error 235 236 BeforeEach(func() { 237 fakeConfig.TargetedOrganizationReturns(configv3.Organization{ 238 Name: "some-org", 239 }) 240 fakeConfig.TargetedSpaceReturns(configv3.Space{ 241 Name: "some-space", 242 }) 243 fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) 244 fakeActor.GetApplicationByNameAndSpaceReturns(v3action.Application{State: "STARTED"}, v3action.Warnings{"get-warning-1", "get-warning-2"}, nil) 245 expectedErr = errors.New("some-error") 246 fakeActor.StopApplicationReturns(v3action.Warnings{"stop-warning-1", "stop-warning-2"}, expectedErr) 247 }) 248 249 It("says that the app failed to stop", func() { 250 Expect(executeErr).To(Equal(expectedErr)) 251 Expect(testUI.Out).To(Say("Stopping app some-app in org some-org / space some-space as steve\\.\\.\\.")) 252 253 Expect(testUI.Err).To(Say("get-warning-1")) 254 Expect(testUI.Err).To(Say("get-warning-2")) 255 Expect(testUI.Err).To(Say("stop-warning-1")) 256 Expect(testUI.Err).To(Say("stop-warning-2")) 257 }) 258 }) 259 })