github.com/Thanhphan1147/cloudfoundry-cli@v7.1.0+incompatible/actor/v7action/task_test.go (about)

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