github.com/loafoe/cli@v7.1.0+incompatible/command/v7/rollback_command_test.go (about) 1 package v7_test 2 3 import ( 4 "errors" 5 "fmt" 6 7 "code.cloudfoundry.org/cli/actor/actionerror" 8 "code.cloudfoundry.org/cli/actor/v7action" 9 "code.cloudfoundry.org/cli/command/commandfakes" 10 "code.cloudfoundry.org/cli/command/flag" 11 v7 "code.cloudfoundry.org/cli/command/v7" 12 "code.cloudfoundry.org/cli/command/v7/v7fakes" 13 "code.cloudfoundry.org/cli/resources" 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("rollback Command", func() { 22 var ( 23 app string 24 binaryName string 25 executeErr error 26 fakeActor *v7fakes.FakeActor 27 fakeConfig *commandfakes.FakeConfig 28 fakeSharedActor *commandfakes.FakeSharedActor 29 input *Buffer 30 testUI *ui.UI 31 32 cmd v7.RollbackCommand 33 ) 34 35 BeforeEach(func() { 36 app = "some-app" 37 binaryName = "faceman" 38 fakeActor = new(v7fakes.FakeActor) 39 fakeConfig = new(commandfakes.FakeConfig) 40 fakeSharedActor = new(commandfakes.FakeSharedActor) 41 input = NewBuffer() 42 testUI = ui.NewTestUI(input, NewBuffer(), NewBuffer()) 43 44 revisions := []resources.Revision{ 45 resources.Revision{Version: 2}, 46 resources.Revision{Version: 1}, 47 } 48 49 fakeActor.GetRevisionsByApplicationNameAndSpaceReturns( 50 revisions, v7action.Warnings{"warning-2"}, nil, 51 ) 52 53 fakeConfig.BinaryNameReturns(binaryName) 54 55 fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) 56 57 fakeConfig.TargetedOrganizationReturns(configv3.Organization{ 58 Name: "some-org", 59 GUID: "some-org-guid", 60 }) 61 62 fakeConfig.TargetedSpaceReturns(configv3.Space{ 63 Name: "some-space", 64 GUID: "some-space-guid", 65 }) 66 67 cmd = v7.RollbackCommand{ 68 RequiredArgs: flag.AppName{AppName: app}, 69 BaseCommand: v7.BaseCommand{ 70 UI: testUI, 71 Config: fakeConfig, 72 Actor: fakeActor, 73 SharedActor: fakeSharedActor, 74 }, 75 } 76 }) 77 78 JustBeforeEach(func() { 79 executeErr = cmd.Execute(nil) 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 When("checking target fails", func() { 87 BeforeEach(func() { 88 fakeSharedActor.CheckTargetReturns(actionerror.NoOrganizationTargetedError{BinaryName: binaryName}) 89 }) 90 91 It("returns an error", func() { 92 Expect(executeErr).To(MatchError(actionerror.NoOrganizationTargetedError{BinaryName: binaryName})) 93 94 Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1)) 95 96 checkTargetedOrg, checkTargetedSpace := fakeSharedActor.CheckTargetArgsForCall(0) 97 Expect(checkTargetedOrg).To(BeTrue()) 98 Expect(checkTargetedSpace).To(BeTrue()) 99 }) 100 }) 101 102 When("the user is not logged in", func() { 103 var expectedErr error 104 105 BeforeEach(func() { 106 expectedErr = errors.New("some current user error") 107 fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) 108 }) 109 110 It("returns an error", func() { 111 Expect(executeErr).To(Equal(expectedErr)) 112 }) 113 }) 114 115 // TODO: Missing app #174107413 116 // When("getting the applications returns an error", func() { 117 // var expectedErr error 118 119 // BeforeEach(func() { 120 // expectedErr = ccerror.RequestError{} 121 // fakeActor.GetAppSummariesForSpaceReturns([]v7action.ApplicationSummary{}, v7action.Warnings{"warning-1", "warning-2"}, expectedErr) 122 // }) 123 124 // It("returns the error and prints warnings", func() { 125 // Expect(executeErr).To(Equal(ccerror.RequestError{})) 126 127 // Expect(testUI.Out).To(Say(`Getting apps in org some-org / space some-space as steve\.\.\.`)) 128 129 // Expect(testUI.Err).To(Say("warning-1")) 130 // Expect(testUI.Err).To(Say("warning-2")) 131 // }) 132 // }) 133 134 When("an app has no revisions", func() { 135 BeforeEach(func() { 136 fakeActor.GetRevisionsByApplicationNameAndSpaceReturns([]resources.Revision{}, nil, nil) 137 }) 138 139 It("displays an error saying that there are no revisions, and does not rollback", func() { 140 Expect(executeErr).NotTo(BeNil()) 141 Expect(executeErr).To(MatchError(fmt.Sprintf("No revisions for app %s", app))) 142 }) 143 }) 144 145 When("the first revision is set as the rollback target", func() { 146 BeforeEach(func() { 147 cmd.Version = flag.PositiveInteger{Value: 1} 148 }) 149 150 When("the app has at least one revision", func() { 151 BeforeEach(func() { 152 fakeActor.GetApplicationByNameAndSpaceReturns( 153 resources.Application{GUID: "123"}, 154 v7action.Warnings{"warning-1"}, 155 nil, 156 ) 157 158 fakeActor.GetRevisionByApplicationAndVersionReturns( 159 resources.Revision{Version: 1, GUID: "some-1-guid"}, 160 v7action.Warnings{"warning-3"}, 161 nil, 162 ) 163 164 fakeActor.CreateDeploymentByApplicationAndRevisionReturns( 165 "deployment-guid", 166 v7action.Warnings{"warning-4"}, 167 nil, 168 ) 169 }) 170 171 When("the user passes the force flag", func() { 172 BeforeEach(func() { 173 cmd.Force = true 174 }) 175 176 It("skips the prompt and executes the rollback", func() { 177 Expect(fakeActor.GetApplicationByNameAndSpaceCallCount()).To(Equal(1), "GetApplicationByNameAndSpace call count") 178 appName, spaceGUID := fakeActor.GetApplicationByNameAndSpaceArgsForCall(0) 179 Expect(appName).To(Equal(app)) 180 Expect(spaceGUID).To(Equal("some-space-guid")) 181 182 Expect(fakeActor.GetRevisionByApplicationAndVersionCallCount()).To(Equal(1), "GetRevisionByApplicationAndVersion call count") 183 appGUID, version := fakeActor.GetRevisionByApplicationAndVersionArgsForCall(0) 184 Expect(appGUID).To(Equal("123")) 185 Expect(version).To(Equal(1)) 186 187 Expect(fakeActor.CreateDeploymentByApplicationAndRevisionCallCount()).To(Equal(1), "CreateDeploymentByApplicationAndRevision call count") 188 appGUID, revisionGUID := fakeActor.CreateDeploymentByApplicationAndRevisionArgsForCall(0) 189 Expect(appGUID).To(Equal("123")) 190 Expect(revisionGUID).To(Equal("some-1-guid")) 191 192 Expect(testUI.Out).ToNot(Say("Rolling '%s' back to revision '1' will create a new revision. The new revision '3' will use the settings from revision '1'.", app)) 193 Expect(testUI.Out).ToNot(Say("Are you sure you want to continue?")) 194 195 Expect(testUI.Out).To(Say("Rolling back to revision 1 for app some-app in org some-org / space some-space as steve...")) 196 Expect(testUI.Err).To(Say("warning-1")) 197 Expect(testUI.Err).To(Say("warning-2")) 198 Expect(testUI.Err).To(Say("warning-3")) 199 Expect(testUI.Err).To(Say("warning-4")) 200 Expect(testUI.Out).To(Say("OK")) 201 }) 202 }) 203 204 When("user says yes to prompt", func() { 205 BeforeEach(func() { 206 _, err := input.Write([]byte("y\n")) 207 Expect(err).NotTo(HaveOccurred()) 208 }) 209 210 It("successfully executes the command and outputs warnings", func() { 211 Expect(fakeActor.GetApplicationByNameAndSpaceCallCount()).To(Equal(1), "GetApplicationByNameAndSpace call count") 212 appName, spaceGUID := fakeActor.GetApplicationByNameAndSpaceArgsForCall(0) 213 Expect(appName).To(Equal(app)) 214 Expect(spaceGUID).To(Equal("some-space-guid")) 215 216 Expect(fakeActor.GetRevisionByApplicationAndVersionCallCount()).To(Equal(1), "GetRevisionByApplicationAndVersion call count") 217 appGUID, version := fakeActor.GetRevisionByApplicationAndVersionArgsForCall(0) 218 Expect(appGUID).To(Equal("123")) 219 Expect(version).To(Equal(1)) 220 221 Expect(fakeActor.CreateDeploymentByApplicationAndRevisionCallCount()).To(Equal(1), "CreateDeploymentByApplicationAndRevision call count") 222 appGUID, revisionGUID := fakeActor.CreateDeploymentByApplicationAndRevisionArgsForCall(0) 223 Expect(appGUID).To(Equal("123")) 224 Expect(revisionGUID).To(Equal("some-1-guid")) 225 226 Expect(testUI.Out).To(Say("Rolling '%s' back to revision '1' will create a new revision. The new revision '3' will use the settings from revision '1'.", app)) 227 Expect(testUI.Out).To(Say("Are you sure you want to continue?")) 228 Expect(testUI.Out).To(Say("Rolling back to revision 1 for app some-app in org some-org / space some-space as steve...")) 229 Expect(testUI.Err).To(Say("warning-1")) 230 Expect(testUI.Err).To(Say("warning-2")) 231 Expect(testUI.Err).To(Say("warning-3")) 232 Expect(testUI.Err).To(Say("warning-4")) 233 Expect(testUI.Out).To(Say("OK")) 234 }) 235 }) 236 237 When("user says no to prompt", func() { 238 BeforeEach(func() { 239 _, err := input.Write([]byte("n\n")) 240 Expect(err).NotTo(HaveOccurred()) 241 }) 242 243 It("does not execute the command and outputs warnings", func() { 244 Expect(fakeActor.GetApplicationByNameAndSpaceCallCount()).To(Equal(1), "GetApplicationByNameAndSpace call count") 245 appName, spaceGUID := fakeActor.GetApplicationByNameAndSpaceArgsForCall(0) 246 Expect(appName).To(Equal(app)) 247 Expect(spaceGUID).To(Equal("some-space-guid")) 248 249 Expect(fakeActor.GetRevisionByApplicationAndVersionCallCount()).To(Equal(1), "GetRevisionByApplicationAndVersion call count") 250 appGUID, version := fakeActor.GetRevisionByApplicationAndVersionArgsForCall(0) 251 Expect(appGUID).To(Equal("123")) 252 Expect(version).To(Equal(1)) 253 254 Expect(fakeActor.CreateDeploymentByApplicationAndRevisionCallCount()).To(Equal(0), "CreateDeploymentByApplicationAndRevision call count") 255 256 Expect(testUI.Out).To(Say("Rolling '%s' back to revision '1' will create a new revision. The new revision '3' will use the settings from revision '1'.", app)) 257 Expect(testUI.Out).To(Say("App '%s' has not been rolled back to revision '1'.", app)) 258 Expect(testUI.Err).To(Say("warning-1")) 259 Expect(testUI.Err).To(Say("warning-2")) 260 Expect(testUI.Err).To(Say("warning-3")) 261 }) 262 }) 263 264 When("the user chooses the default", func() { 265 BeforeEach(func() { 266 _, err := input.Write([]byte("\n")) 267 Expect(err).NotTo(HaveOccurred()) 268 }) 269 270 It("cancels the rollback", func() { 271 Expect(executeErr).NotTo(HaveOccurred()) 272 273 Expect(testUI.Out).To(Say("App '%s' has not been rolled back to revision '1'.", app)) 274 Expect(fakeActor.CreateDeploymentByApplicationAndRevisionCallCount()).To(Equal(0)) 275 }) 276 }) 277 }) 278 }) 279 })