github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+incompatible/actor/v7action/task_test.go (about) 1 package v7action_test 2 3 import ( 4 "code.cloudfoundry.org/cli/resources" 5 "errors" 6 7 "code.cloudfoundry.org/cli/actor/actionerror" 8 . "code.cloudfoundry.org/cli/actor/v7action" 9 "code.cloudfoundry.org/cli/actor/v7action/v7actionfakes" 10 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 11 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" 12 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" 13 . "github.com/onsi/ginkgo" 14 . "github.com/onsi/gomega" 15 ) 16 17 var _ = Describe("Task Actions", func() { 18 var ( 19 actor *Actor 20 fakeCloudControllerClient *v7actionfakes.FakeCloudControllerClient 21 ) 22 23 BeforeEach(func() { 24 fakeCloudControllerClient = new(v7actionfakes.FakeCloudControllerClient) 25 actor = NewActor(fakeCloudControllerClient, nil, nil, nil) 26 }) 27 28 Describe("RunTask", func() { 29 When("the application exists", func() { 30 BeforeEach(func() { 31 fakeCloudControllerClient.CreateApplicationTaskReturns( 32 resources.Task{ 33 SequenceID: 3, 34 }, 35 ccv3.Warnings{ 36 "warning-1", 37 "warning-2", 38 }, 39 nil, 40 ) 41 }) 42 43 It("creates and returns the task and all warnings", func() { 44 expectedTask := Task{ 45 Command: "some command", 46 Name: "some-task-name", 47 MemoryInMB: 123, 48 DiskInMB: 321, 49 } 50 task, warnings, err := actor.RunTask("some-app-guid", expectedTask) 51 Expect(err).ToNot(HaveOccurred()) 52 53 Expect(task).To(Equal(Task{ 54 SequenceID: 3, 55 })) 56 Expect(warnings).To(ConsistOf("warning-1", "warning-2")) 57 58 Expect(fakeCloudControllerClient.CreateApplicationTaskCallCount()).To(Equal(1)) 59 appGUIDArg, taskArg := fakeCloudControllerClient.CreateApplicationTaskArgsForCall(0) 60 Expect(appGUIDArg).To(Equal("some-app-guid")) 61 Expect(taskArg).To(Equal(resources.Task(expectedTask))) 62 }) 63 }) 64 65 When("the cloud controller client returns an error", func() { 66 var warnings Warnings 67 var err error 68 var expectedErr error 69 70 JustBeforeEach(func() { 71 _, warnings, err = actor.RunTask("some-app-guid", Task{Command: "some command"}) 72 }) 73 74 When("the cloud controller error is generic", func() { 75 BeforeEach(func() { 76 expectedErr = errors.New("I am a CloudControllerClient Error") 77 fakeCloudControllerClient.CreateApplicationTaskReturns( 78 resources.Task{}, 79 ccv3.Warnings{"warning-1", "warning-2"}, 80 expectedErr, 81 ) 82 }) 83 84 It("returns the same error and all warnings", func() { 85 Expect(err).To(MatchError(expectedErr)) 86 Expect(warnings).To(ConsistOf("warning-1", "warning-2")) 87 }) 88 }) 89 90 When("the error is a TaskWorkersUnavailableError", func() { 91 BeforeEach(func() { 92 fakeCloudControllerClient.CreateApplicationTaskReturns( 93 resources.Task{}, 94 ccv3.Warnings{"warning-1", "warning-2"}, 95 ccerror.TaskWorkersUnavailableError{Message: "banana babans"}, 96 ) 97 }) 98 99 It("returns a TaskWorkersUnavailableError and all warnings", func() { 100 Expect(err).To(MatchError(actionerror.TaskWorkersUnavailableError{Message: "banana babans"})) 101 Expect(warnings).To(ConsistOf("warning-1", "warning-2")) 102 }) 103 }) 104 }) 105 }) 106 107 Describe("GetApplicationTasks", func() { 108 When("the application exists", func() { 109 When("there are associated tasks", func() { 110 var ( 111 task1 resources.Task 112 task2 resources.Task 113 task3 resources.Task 114 ) 115 116 BeforeEach(func() { 117 task1 = resources.Task{ 118 GUID: "task-1-guid", 119 SequenceID: 1, 120 Name: "task-1", 121 State: constant.TaskSucceeded, 122 CreatedAt: "some-time", 123 Command: "some-command", 124 } 125 task2 = resources.Task{ 126 GUID: "task-2-guid", 127 SequenceID: 2, 128 Name: "task-2", 129 State: constant.TaskFailed, 130 CreatedAt: "some-time", 131 Command: "some-command", 132 } 133 task3 = resources.Task{ 134 GUID: "task-3-guid", 135 SequenceID: 3, 136 Name: "task-3", 137 State: constant.TaskRunning, 138 CreatedAt: "some-time", 139 Command: "some-command", 140 } 141 fakeCloudControllerClient.GetApplicationTasksReturns( 142 []resources.Task{task3, task1, task2}, 143 ccv3.Warnings{"warning-1", "warning-2"}, 144 nil, 145 ) 146 }) 147 148 It("returns all tasks associated with the application and all warnings", func() { 149 tasks, warnings, err := actor.GetApplicationTasks("some-app-guid", Descending) 150 Expect(err).ToNot(HaveOccurred()) 151 152 Expect(tasks).To(Equal([]Task{Task(task3), Task(task2), Task(task1)})) 153 Expect(warnings).To(ConsistOf("warning-1", "warning-2")) 154 155 tasks, warnings, err = actor.GetApplicationTasks("some-app-guid", Ascending) 156 Expect(err).ToNot(HaveOccurred()) 157 158 Expect(tasks).To(Equal([]Task{Task(task1), Task(task2), Task(task3)})) 159 Expect(warnings).To(ConsistOf("warning-1", "warning-2")) 160 161 Expect(fakeCloudControllerClient.GetApplicationTasksCallCount()).To(Equal(2)) 162 appGUID, query := fakeCloudControllerClient.GetApplicationTasksArgsForCall(0) 163 Expect(appGUID).To(Equal("some-app-guid")) 164 Expect(query).To(BeNil()) 165 }) 166 }) 167 168 When("there are no associated tasks", func() { 169 BeforeEach(func() { 170 fakeCloudControllerClient.GetApplicationTasksReturns( 171 []resources.Task{}, 172 nil, 173 nil, 174 ) 175 }) 176 177 It("returns an empty list of tasks", func() { 178 tasks, _, err := actor.GetApplicationTasks("some-app-guid", Descending) 179 Expect(err).ToNot(HaveOccurred()) 180 Expect(tasks).To(BeEmpty()) 181 }) 182 }) 183 }) 184 185 When("the cloud controller client returns an error", func() { 186 var expectedErr error 187 188 BeforeEach(func() { 189 expectedErr = errors.New("I am a CloudControllerClient Error") 190 fakeCloudControllerClient.GetApplicationTasksReturns( 191 []resources.Task{}, 192 ccv3.Warnings{"warning-1", "warning-2"}, 193 expectedErr, 194 ) 195 }) 196 197 It("returns the same error and all warnings", func() { 198 _, warnings, err := actor.GetApplicationTasks("some-app-guid", Descending) 199 Expect(err).To(MatchError(expectedErr)) 200 Expect(warnings).To(ConsistOf("warning-1", "warning-2")) 201 }) 202 }) 203 }) 204 205 Describe("GetTaskBySequenceIDAndApplication", func() { 206 When("the cloud controller client does not return an error", func() { 207 When("the task is found", func() { 208 var task1 resources.Task 209 210 BeforeEach(func() { 211 task1 = resources.Task{ 212 GUID: "task-1-guid", 213 SequenceID: 1, 214 } 215 fakeCloudControllerClient.GetApplicationTasksReturns( 216 []resources.Task{task1}, 217 ccv3.Warnings{"get-task-warning-1"}, 218 nil, 219 ) 220 }) 221 222 It("returns the task and warnings", func() { 223 task, warnings, err := actor.GetTaskBySequenceIDAndApplication(1, "some-app-guid") 224 Expect(err).ToNot(HaveOccurred()) 225 Expect(task).To(Equal(Task(task1))) 226 Expect(warnings).To(ConsistOf("get-task-warning-1")) 227 }) 228 }) 229 230 When("the task is not found", func() { 231 BeforeEach(func() { 232 fakeCloudControllerClient.GetApplicationTasksReturns( 233 []resources.Task{}, 234 ccv3.Warnings{"get-task-warning-1"}, 235 nil, 236 ) 237 }) 238 239 It("returns a TaskNotFoundError and warnings", func() { 240 _, warnings, err := actor.GetTaskBySequenceIDAndApplication(1, "some-app-guid") 241 Expect(err).To(MatchError(actionerror.TaskNotFoundError{SequenceID: 1})) 242 Expect(warnings).To(ConsistOf("get-task-warning-1")) 243 }) 244 }) 245 }) 246 247 When("the cloud controller client returns an error", func() { 248 var expectedErr error 249 250 BeforeEach(func() { 251 expectedErr = errors.New("generic-error") 252 fakeCloudControllerClient.GetApplicationTasksReturns( 253 []resources.Task{}, 254 ccv3.Warnings{"get-task-warning-1"}, 255 expectedErr, 256 ) 257 }) 258 259 It("returns the same error and warnings", func() { 260 _, warnings, err := actor.GetTaskBySequenceIDAndApplication(1, "some-app-guid") 261 Expect(err).To(Equal(expectedErr)) 262 Expect(warnings).To(ConsistOf("get-task-warning-1")) 263 }) 264 }) 265 }) 266 267 Describe("TerminateTask", func() { 268 When("the task exists", func() { 269 var returnedTask resources.Task 270 271 BeforeEach(func() { 272 returnedTask = resources.Task{ 273 GUID: "some-task-guid", 274 SequenceID: 1, 275 } 276 fakeCloudControllerClient.UpdateTaskCancelReturns( 277 returnedTask, 278 ccv3.Warnings{"update-task-warning"}, 279 nil) 280 }) 281 282 It("returns the task and warnings", func() { 283 task, warnings, err := actor.TerminateTask("some-task-guid") 284 Expect(err).NotTo(HaveOccurred()) 285 Expect(warnings).To(ConsistOf("update-task-warning")) 286 Expect(task).To(Equal(Task(returnedTask))) 287 }) 288 }) 289 290 When("the cloud controller returns an error", func() { 291 var expectedErr error 292 293 BeforeEach(func() { 294 expectedErr = errors.New("cc-error") 295 fakeCloudControllerClient.UpdateTaskCancelReturns( 296 resources.Task{}, 297 ccv3.Warnings{"update-task-warning"}, 298 expectedErr) 299 }) 300 301 It("returns the same error and warnings", func() { 302 _, warnings, err := actor.TerminateTask("some-task-guid") 303 Expect(err).To(MatchError(expectedErr)) 304 Expect(warnings).To(ConsistOf("update-task-warning")) 305 }) 306 }) 307 }) 308 })