code.cloudfoundry.org/cli@v7.1.0+incompatible/actor/v7pushaction/create_deployment_for_push_plan_test.go (about)

     1  package v7pushaction_test
     2  
     3  import (
     4  	"errors"
     5  
     6  	"code.cloudfoundry.org/cli/actor/v7action"
     7  	. "code.cloudfoundry.org/cli/actor/v7pushaction"
     8  	"code.cloudfoundry.org/cli/actor/v7pushaction/v7pushactionfakes"
     9  	"code.cloudfoundry.org/cli/resources"
    10  	. "github.com/onsi/ginkgo"
    11  	. "github.com/onsi/gomega"
    12  )
    13  
    14  var _ = Describe("CreateDeploymentForApplication()", func() {
    15  	var (
    16  		actor       *Actor
    17  		fakeV7Actor *v7pushactionfakes.FakeV7Actor
    18  
    19  		returnedPushPlan PushPlan
    20  		paramPlan        PushPlan
    21  		fakeProgressBar  *v7pushactionfakes.FakeProgressBar
    22  
    23  		warnings   Warnings
    24  		executeErr error
    25  
    26  		events []Event
    27  	)
    28  
    29  	BeforeEach(func() {
    30  		actor, fakeV7Actor, _ = getTestPushActor()
    31  
    32  		fakeProgressBar = new(v7pushactionfakes.FakeProgressBar)
    33  
    34  		paramPlan = PushPlan{
    35  			Application: resources.Application{
    36  				GUID: "some-app-guid",
    37  			},
    38  		}
    39  	})
    40  
    41  	JustBeforeEach(func() {
    42  		events = EventFollower(func(eventStream chan<- *PushEvent) {
    43  			returnedPushPlan, warnings, executeErr = actor.CreateDeploymentForApplication(paramPlan, eventStream, fakeProgressBar)
    44  		})
    45  	})
    46  
    47  	Describe("creating deployment", func() {
    48  		When("creating the deployment is successful", func() {
    49  			BeforeEach(func() {
    50  				fakeV7Actor.PollStartForRollingCalls(func(_ resources.Application, _ string, _ bool, handleInstanceDetails func(string)) (warnings v7action.Warnings, err error) {
    51  					handleInstanceDetails("Instances starting...")
    52  					return nil, nil
    53  				})
    54  
    55  				fakeV7Actor.CreateDeploymentByApplicationAndDropletReturns(
    56  					"some-deployment-guid",
    57  					v7action.Warnings{"some-deployment-warning"},
    58  					nil,
    59  				)
    60  			})
    61  
    62  			It("waits for the app to start", func() {
    63  				Expect(fakeV7Actor.PollStartForRollingCallCount()).To(Equal(1))
    64  				givenApp, givenDeploymentGUID, noWait, _ := fakeV7Actor.PollStartForRollingArgsForCall(0)
    65  				Expect(givenApp).To(Equal(resources.Application{GUID: "some-app-guid"}))
    66  				Expect(givenDeploymentGUID).To(Equal("some-deployment-guid"))
    67  				Expect(noWait).To(Equal(false))
    68  				Expect(events).To(ConsistOf(StartingDeployment, InstanceDetails, WaitingForDeployment))
    69  			})
    70  
    71  			It("returns errors and warnings", func() {
    72  				Expect(returnedPushPlan).To(Equal(paramPlan))
    73  				Expect(executeErr).NotTo(HaveOccurred())
    74  				Expect(warnings).To(ConsistOf("some-deployment-warning"))
    75  			})
    76  
    77  			It("records deployment events", func() {
    78  				Expect(events).To(ConsistOf(StartingDeployment, InstanceDetails, WaitingForDeployment))
    79  			})
    80  		})
    81  
    82  		When("creating the package errors", func() {
    83  			var someErr error
    84  
    85  			BeforeEach(func() {
    86  				someErr = errors.New("failed to create deployment")
    87  
    88  				fakeV7Actor.CreateDeploymentByApplicationAndDropletReturns(
    89  					"",
    90  					v7action.Warnings{"some-deployment-warning"},
    91  					someErr,
    92  				)
    93  			})
    94  
    95  			It("does not wait for the app to start", func() {
    96  				Expect(fakeV7Actor.PollStartForRollingCallCount()).To(Equal(0))
    97  			})
    98  
    99  			It("returns errors and warnings", func() {
   100  				Expect(returnedPushPlan).To(Equal(paramPlan))
   101  				Expect(executeErr).To(MatchError(someErr))
   102  				Expect(warnings).To(ConsistOf("some-deployment-warning"))
   103  			})
   104  
   105  			It("records deployment events", func() {
   106  				Expect(events).To(ConsistOf(StartingDeployment))
   107  			})
   108  		})
   109  	})
   110  
   111  	Describe("waiting for app to start", func() {
   112  		When("the the polling is successful", func() {
   113  			BeforeEach(func() {
   114  				fakeV7Actor.PollStartForRollingReturns(v7action.Warnings{"some-poll-start-warning"}, nil)
   115  			})
   116  
   117  			It("returns warnings and unchanged push plan", func() {
   118  				Expect(returnedPushPlan).To(Equal(paramPlan))
   119  				Expect(warnings).To(ConsistOf("some-poll-start-warning"))
   120  			})
   121  
   122  			It("records deployment events", func() {
   123  				Expect(events).To(ConsistOf(StartingDeployment, WaitingForDeployment))
   124  			})
   125  		})
   126  
   127  		When("the the polling returns an error", func() {
   128  			var someErr error
   129  
   130  			BeforeEach(func() {
   131  				someErr = errors.New("app failed to start")
   132  				fakeV7Actor.PollStartForRollingReturns(v7action.Warnings{"some-poll-start-warning"}, someErr)
   133  			})
   134  
   135  			It("returns errors and warnings", func() {
   136  				Expect(warnings).To(ConsistOf("some-poll-start-warning"))
   137  				Expect(executeErr).To(MatchError(someErr))
   138  			})
   139  
   140  			It("records deployment events", func() {
   141  				Expect(events).To(ConsistOf(StartingDeployment, WaitingForDeployment))
   142  			})
   143  		})
   144  
   145  		When("the noWait flag is set", func() {
   146  			BeforeEach(func() {
   147  				paramPlan.NoWait = true
   148  			})
   149  
   150  			It("passes in the noWait flag", func() {
   151  				_, _, noWait, _ := fakeV7Actor.PollStartForRollingArgsForCall(0)
   152  				Expect(noWait).To(Equal(true))
   153  			})
   154  		})
   155  	})
   156  })