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