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