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  })