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

     1  package v7pushaction_test
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  
     7  	"code.cloudfoundry.org/cli/actor/sharedaction"
     8  	. "code.cloudfoundry.org/cli/actor/v7pushaction"
     9  	"code.cloudfoundry.org/cli/actor/v7pushaction/v7pushactionfakes"
    10  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
    11  	"code.cloudfoundry.org/cli/resources"
    12  	. "github.com/onsi/ginkgo"
    13  	. "github.com/onsi/gomega"
    14  )
    15  
    16  func streamsDrainedAndClosed(eventStream <-chan *PushEvent) bool {
    17  	for range eventStream {
    18  	}
    19  	return true
    20  }
    21  
    22  // TODO: for refactor: We can use the following style of code to validate that
    23  // each event is received in a specific order
    24  
    25  // Expect(nextEvent()).Should(Equal(SettingUpApplication))
    26  // Expect(nextEvent()).Should(Equal(CreatingApplication))
    27  // Expect(nextEvent()).Should(Equal(...))
    28  // Expect(nextEvent()).Should(Equal(...))
    29  // Expect(nextEvent()).Should(Equal(...))
    30  
    31  func buildV3Resource(name string) sharedaction.V3Resource {
    32  	return sharedaction.V3Resource{
    33  		FilePath:    name,
    34  		Checksum:    ccv3.Checksum{Value: fmt.Sprintf("checksum-%s", name)},
    35  		SizeInBytes: 6,
    36  	}
    37  }
    38  
    39  var _ = Describe("Actualize", func() {
    40  	var (
    41  		actor *Actor
    42  
    43  		plan            PushPlan
    44  		fakeProgressBar *v7pushactionfakes.FakeProgressBar
    45  
    46  		successfulChangeAppFuncCallCount int
    47  		warningChangeAppFuncCallCount    int
    48  		errorChangeAppFuncCallCount      int
    49  
    50  		eventStream <-chan *PushEvent
    51  
    52  		expectedPlan PushPlan
    53  	)
    54  
    55  	successfulChangeAppFunc := func(pushPlan PushPlan, eStream chan<- *PushEvent, progressBar ProgressBar) (PushPlan, Warnings, error) {
    56  		defer GinkgoRecover()
    57  
    58  		Expect(pushPlan).To(Equal(plan))
    59  		Expect(eStream).ToNot(BeNil())
    60  		Expect(progressBar).To(Equal(fakeProgressBar))
    61  
    62  		pushPlan.Application.GUID = "successful-app-guid"
    63  		successfulChangeAppFuncCallCount++
    64  		return pushPlan, nil, nil
    65  	}
    66  
    67  	warningChangeAppFunc := func(pushPlan PushPlan, eventStream chan<- *PushEvent, progressBar ProgressBar) (PushPlan, Warnings, error) {
    68  		pushPlan.Application.GUID = "warning-app-guid"
    69  		warningChangeAppFuncCallCount++
    70  		return pushPlan, Warnings{"warning-1", "warning-2"}, nil
    71  	}
    72  
    73  	errorChangeAppFunc := func(pushPlan PushPlan, eventStream chan<- *PushEvent, progressBar ProgressBar) (PushPlan, Warnings, error) {
    74  		pushPlan.Application.GUID = "error-app-guid"
    75  		errorChangeAppFuncCallCount++
    76  		return pushPlan, nil, errors.New("some error")
    77  	}
    78  
    79  	BeforeEach(func() {
    80  		actor, _, _ = getTestPushActor()
    81  
    82  		successfulChangeAppFuncCallCount = 0
    83  		warningChangeAppFuncCallCount = 0
    84  		errorChangeAppFuncCallCount = 0
    85  
    86  		fakeProgressBar = new(v7pushactionfakes.FakeProgressBar)
    87  		plan = PushPlan{
    88  			Application: resources.Application{
    89  				Name: "some-app",
    90  				GUID: "some-app-guid",
    91  			},
    92  			SpaceGUID: "some-space-guid",
    93  		}
    94  
    95  		expectedPlan = plan
    96  	})
    97  
    98  	AfterEach(func() {
    99  		Eventually(streamsDrainedAndClosed(eventStream)).Should(BeTrue())
   100  	})
   101  
   102  	JustBeforeEach(func() {
   103  		eventStream = actor.Actualize(plan, fakeProgressBar)
   104  	})
   105  
   106  	Describe("ChangeApplicationSequence", func() {
   107  		When("none of the ChangeApplicationSequence return errors", func() {
   108  			BeforeEach(func() {
   109  				actor.ChangeApplicationSequence = func(plan PushPlan) []ChangeApplicationFunc {
   110  					return []ChangeApplicationFunc{
   111  						successfulChangeAppFunc,
   112  						warningChangeAppFunc,
   113  					}
   114  				}
   115  			})
   116  
   117  			It("iterates over the actor's ChangeApplicationSequence", func() {
   118  				expectedPlan.Application.GUID = "successful-app-guid"
   119  				Eventually(eventStream).Should(Receive(Equal(&PushEvent{Plan: expectedPlan})))
   120  
   121  				expectedPlan.Application.GUID = "warning-app-guid"
   122  				Eventually(eventStream).Should(Receive(Equal(&PushEvent{Plan: expectedPlan, Warnings: Warnings{"warning-1", "warning-2"}})))
   123  
   124  				Expect(successfulChangeAppFuncCallCount).To(Equal(1))
   125  				Expect(warningChangeAppFuncCallCount).To(Equal(1))
   126  				Expect(errorChangeAppFuncCallCount).To(Equal(0))
   127  			})
   128  		})
   129  
   130  		When("the ChangeApplicationSequence return errors", func() {
   131  			BeforeEach(func() {
   132  				actor.ChangeApplicationSequence = func(plan PushPlan) []ChangeApplicationFunc {
   133  					return []ChangeApplicationFunc{
   134  						errorChangeAppFunc,
   135  						successfulChangeAppFunc,
   136  					}
   137  				}
   138  			})
   139  
   140  			It("iterates over the actor's ChangeApplicationSequence", func() {
   141  				expectedPlan.Application.GUID = "error-app-guid"
   142  				Eventually(eventStream).Should(Receive(Equal(&PushEvent{Plan: expectedPlan, Err: errors.New("some error")})))
   143  
   144  				Expect(successfulChangeAppFuncCallCount).To(Equal(0))
   145  				Expect(warningChangeAppFuncCallCount).To(Equal(0))
   146  				Expect(errorChangeAppFuncCallCount).To(Equal(1))
   147  			})
   148  		})
   149  	})
   150  })