github.com/cloudfoundry-attic/cli-with-i18n@v6.32.1-0.20171002233121-7401370d3b85+incompatible/actor/v3action/task_test.go (about) 1 package v3action_test 2 3 import ( 4 "errors" 5 "net/url" 6 7 . "code.cloudfoundry.org/cli/actor/v3action" 8 "code.cloudfoundry.org/cli/actor/v3action/v3actionfakes" 9 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 10 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" 11 . "github.com/onsi/ginkgo" 12 . "github.com/onsi/gomega" 13 ) 14 15 var _ = Describe("Task Actions", func() { 16 var ( 17 actor *Actor 18 fakeCloudControllerClient *v3actionfakes.FakeCloudControllerClient 19 ) 20 21 BeforeEach(func() { 22 fakeCloudControllerClient = new(v3actionfakes.FakeCloudControllerClient) 23 actor = NewActor(nil, fakeCloudControllerClient, nil) 24 }) 25 26 Describe("RunTask", func() { 27 Context("when the application exists", func() { 28 BeforeEach(func() { 29 fakeCloudControllerClient.CreateApplicationTaskReturns( 30 ccv3.Task{ 31 SequenceID: 3, 32 }, 33 ccv3.Warnings{ 34 "warning-1", 35 "warning-2", 36 }, 37 nil, 38 ) 39 }) 40 41 It("creates and returns the task and all warnings", func() { 42 expectedTask := Task{ 43 Command: "some command", 44 Name: "some-task-name", 45 MemoryInMB: 123, 46 DiskInMB: 321, 47 } 48 task, warnings, err := actor.RunTask("some-app-guid", expectedTask) 49 Expect(err).ToNot(HaveOccurred()) 50 51 Expect(task).To(Equal(Task{ 52 SequenceID: 3, 53 })) 54 Expect(warnings).To(ConsistOf("warning-1", "warning-2")) 55 56 Expect(fakeCloudControllerClient.CreateApplicationTaskCallCount()).To(Equal(1)) 57 appGUIDArg, taskArg := fakeCloudControllerClient.CreateApplicationTaskArgsForCall(0) 58 Expect(appGUIDArg).To(Equal("some-app-guid")) 59 Expect(taskArg).To(Equal(ccv3.Task(expectedTask))) 60 }) 61 }) 62 63 Context("when the cloud controller client returns an error", func() { 64 var warnings Warnings 65 var err error 66 var expectedErr error 67 68 JustBeforeEach(func() { 69 _, warnings, err = actor.RunTask("some-app-guid", Task{Command: "some command"}) 70 }) 71 72 Context("when the cloud controller error is generic", func() { 73 BeforeEach(func() { 74 expectedErr = errors.New("I am a CloudControllerClient Error") 75 fakeCloudControllerClient.CreateApplicationTaskReturns( 76 ccv3.Task{}, 77 ccv3.Warnings{"warning-1", "warning-2"}, 78 expectedErr, 79 ) 80 }) 81 82 It("returns the same error and all warnings", func() { 83 Expect(err).To(MatchError(expectedErr)) 84 Expect(warnings).To(ConsistOf("warning-1", "warning-2")) 85 }) 86 }) 87 88 Context("when the error is a TaskWorkersUnavailableError", func() { 89 BeforeEach(func() { 90 fakeCloudControllerClient.CreateApplicationTaskReturns( 91 ccv3.Task{}, 92 ccv3.Warnings{"warning-1", "warning-2"}, 93 ccerror.TaskWorkersUnavailableError{Message: "banana babans"}, 94 ) 95 }) 96 97 It("returns a TaskWorkersUnavailableError and all warnings", func() { 98 Expect(err).To(MatchError(TaskWorkersUnavailableError{Message: "banana babans"})) 99 Expect(warnings).To(ConsistOf("warning-1", "warning-2")) 100 }) 101 }) 102 }) 103 }) 104 105 Describe("GetApplicationTasks", func() { 106 Context("when the application exists", func() { 107 Context("when there are associated tasks", func() { 108 var ( 109 task1 ccv3.Task 110 task2 ccv3.Task 111 task3 ccv3.Task 112 ) 113 114 BeforeEach(func() { 115 task1 = ccv3.Task{ 116 GUID: "task-1-guid", 117 SequenceID: 1, 118 Name: "task-1", 119 State: "SUCCEEDED", 120 CreatedAt: "some-time", 121 Command: "some-command", 122 } 123 task2 = ccv3.Task{ 124 GUID: "task-2-guid", 125 SequenceID: 2, 126 Name: "task-2", 127 State: "FAILED", 128 CreatedAt: "some-time", 129 Command: "some-command", 130 } 131 task3 = ccv3.Task{ 132 GUID: "task-3-guid", 133 SequenceID: 3, 134 Name: "task-3", 135 State: "RUNNING", 136 CreatedAt: "some-time", 137 Command: "some-command", 138 } 139 fakeCloudControllerClient.GetApplicationTasksReturns( 140 []ccv3.Task{task3, task1, task2}, 141 ccv3.Warnings{"warning-1", "warning-2"}, 142 nil, 143 ) 144 }) 145 146 It("returns all tasks associated with the application and all warnings", func() { 147 tasks, warnings, err := actor.GetApplicationTasks("some-app-guid", Descending) 148 Expect(err).ToNot(HaveOccurred()) 149 150 Expect(tasks).To(Equal([]Task{Task(task3), Task(task2), Task(task1)})) 151 Expect(warnings).To(ConsistOf("warning-1", "warning-2")) 152 153 tasks, warnings, err = actor.GetApplicationTasks("some-app-guid", Ascending) 154 Expect(err).ToNot(HaveOccurred()) 155 156 Expect(tasks).To(Equal([]Task{Task(task1), Task(task2), Task(task3)})) 157 Expect(warnings).To(ConsistOf("warning-1", "warning-2")) 158 159 Expect(fakeCloudControllerClient.GetApplicationTasksCallCount()).To(Equal(2)) 160 appGUID, query := fakeCloudControllerClient.GetApplicationTasksArgsForCall(0) 161 Expect(appGUID).To(Equal("some-app-guid")) 162 Expect(query).To(Equal( 163 url.Values{}, 164 )) 165 }) 166 }) 167 168 Context("when there are no associated tasks", func() { 169 BeforeEach(func() { 170 fakeCloudControllerClient.GetApplicationTasksReturns( 171 []ccv3.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 Context("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 []ccv3.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 Context("when the cloud controller client does not return an error", func() { 207 Context("when the task is found", func() { 208 var task1 ccv3.Task 209 210 BeforeEach(func() { 211 task1 = ccv3.Task{ 212 GUID: "task-1-guid", 213 SequenceID: 1, 214 } 215 fakeCloudControllerClient.GetApplicationTasksReturns( 216 []ccv3.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 Context("when the task is not found", func() { 231 BeforeEach(func() { 232 fakeCloudControllerClient.GetApplicationTasksReturns( 233 []ccv3.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(TaskNotFoundError{SequenceID: 1})) 242 Expect(warnings).To(ConsistOf("get-task-warning-1")) 243 }) 244 }) 245 }) 246 247 Context("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 []ccv3.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 Context("when the task exists", func() { 269 var returnedTask ccv3.Task 270 271 BeforeEach(func() { 272 returnedTask = ccv3.Task{ 273 GUID: "some-task-guid", 274 SequenceID: 1, 275 } 276 fakeCloudControllerClient.UpdateTaskReturns( 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 Context("when the cloud controller returns an error", func() { 291 var expectedErr error 292 293 BeforeEach(func() { 294 expectedErr = errors.New("cc-error") 295 fakeCloudControllerClient.UpdateTaskReturns( 296 ccv3.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 })