github.com/ablease/cli@v6.37.1-0.20180613014814-3adbb7d7fb19+incompatible/actor/v2v3action/manifest_test.go (about)

     1  package v2v3action_test
     2  
     3  import (
     4  	"errors"
     5  
     6  	. "github.com/onsi/ginkgo"
     7  	. "github.com/onsi/gomega"
     8  	. "github.com/onsi/gomega/gstruct"
     9  
    10  	"code.cloudfoundry.org/cli/actor/v2action"
    11  	. "code.cloudfoundry.org/cli/actor/v2v3action"
    12  	"code.cloudfoundry.org/cli/actor/v2v3action/v2v3actionfakes"
    13  	"code.cloudfoundry.org/cli/actor/v3action"
    14  	"code.cloudfoundry.org/cli/types"
    15  	"code.cloudfoundry.org/cli/util/manifest"
    16  )
    17  
    18  var _ = Describe("Manifest", func() {
    19  	var (
    20  		actor       *Actor
    21  		fakeV2Actor *v2v3actionfakes.FakeV2Actor
    22  		fakeV3Actor *v2v3actionfakes.FakeV3Actor
    23  
    24  		appName  string
    25  		appSpace string
    26  
    27  		manifestApp manifest.Application
    28  		warnings    Warnings
    29  		executeErr  error
    30  	)
    31  
    32  	BeforeEach(func() {
    33  		fakeV2Actor = new(v2v3actionfakes.FakeV2Actor)
    34  		fakeV3Actor = new(v2v3actionfakes.FakeV3Actor)
    35  
    36  		actor = NewActor(fakeV2Actor, fakeV3Actor)
    37  
    38  		appName = "some-app-name"
    39  		appSpace = "some-space-GUID"
    40  	})
    41  
    42  	JustBeforeEach(func() {
    43  		manifestApp, warnings, executeErr = actor.CreateApplicationManifestByNameAndSpace(appName, appSpace)
    44  	})
    45  
    46  	It("calls v2Actor.CreateManifestApplication with the appName and appSpace", func() {
    47  		Expect(fakeV2Actor.CreateApplicationManifestByNameAndSpaceCallCount()).To(Equal(1))
    48  		appNameArg, appSpaceArg := fakeV2Actor.CreateApplicationManifestByNameAndSpaceArgsForCall(0)
    49  		Expect(appNameArg).To(Equal(appName))
    50  		Expect(appSpaceArg).To(Equal(appSpace))
    51  	})
    52  
    53  	Context("when v2Actor.CreateManifestApplication succeeds", func() {
    54  		BeforeEach(func() {
    55  			v2Application := manifest.Application{
    56  				Buildpacks: []string{"some-buildpack"},
    57  			}
    58  
    59  			fakeV2Actor.CreateApplicationManifestByNameAndSpaceReturns(v2Application, v2action.Warnings{"v2-action-warnings"}, nil)
    60  		})
    61  
    62  		Context("when the cc returns an invalid semver", func() {
    63  			BeforeEach(func() {
    64  				fakeV3Actor.CloudControllerAPIVersionReturns("i am invalid")
    65  			})
    66  
    67  			It("returns a semver error", func() {
    68  				Expect(executeErr).To(MatchError("No Major.Minor.Patch elements found"))
    69  				Expect(warnings).To(ConsistOf("v2-action-warnings"))
    70  			})
    71  
    72  		})
    73  
    74  		Context("when the cc has a v3 buildpacks endpoint ( >= v3.25)", func() {
    75  			BeforeEach(func() {
    76  				fakeV3Actor.CloudControllerAPIVersionReturns("3.25.0")
    77  			})
    78  
    79  			It("Calls the v3actor.GetApplicationByNameAndSpace with the appName and appSpace", func() {
    80  				Expect(fakeV3Actor.GetApplicationByNameAndSpaceCallCount()).To(Equal(1))
    81  				appNameArg, appSpaceArg := fakeV3Actor.GetApplicationByNameAndSpaceArgsForCall(0)
    82  				Expect(appNameArg).To(Equal(appName))
    83  				Expect(appSpaceArg).To(Equal(appSpace))
    84  			})
    85  
    86  			Context("when the v3Actor.GetApplicationByNameAndSpace succeeds", func() {
    87  				BeforeEach(func() {
    88  					v3Application := v3action.Application{LifecycleBuildpacks: []string{"some-buildpack"}}
    89  					fakeV3Actor.GetApplicationByNameAndSpaceReturns(v3Application, v3action.Warnings{"v3-action-warnings"}, nil)
    90  				})
    91  
    92  				It("should return an application with v3 specific attributes", func() {
    93  					Expect(executeErr).ToNot(HaveOccurred())
    94  					Expect(warnings).To(ConsistOf("v2-action-warnings", "v3-action-warnings"))
    95  					Expect(manifestApp).To(MatchFields(IgnoreExtras, Fields{
    96  						"Buildpack":  Equal(types.FilteredString{}),
    97  						"Buildpacks": ConsistOf("some-buildpack"),
    98  					}))
    99  				})
   100  			})
   101  
   102  			Context("when the v3Actor.GetApplicationByNameAndSpace fails", func() {
   103  				BeforeEach(func() {
   104  					fakeV3Actor.GetApplicationByNameAndSpaceReturns(v3action.Application{}, v3action.Warnings{"v3-action-warnings"}, errors.New("i'm a v3 error"))
   105  				})
   106  
   107  				It("it raises the error", func() {
   108  					Expect(executeErr).To(MatchError("i'm a v3 error"))
   109  					Expect(warnings).To(ConsistOf("v2-action-warnings", "v3-action-warnings"))
   110  				})
   111  			})
   112  		})
   113  
   114  		Context("when the cc does not have a v3 buildpacks endpoint ( < v3.25)", func() {
   115  			BeforeEach(func() {
   116  				fakeV3Actor.CloudControllerAPIVersionReturns("3.24.0")
   117  			})
   118  
   119  			It("does not call the v3actor.GetApplicationByNameAndSpace", func() {
   120  				Expect(fakeV3Actor.GetApplicationByNameAndSpaceCallCount()).To(Equal(0))
   121  			})
   122  
   123  			It("returns the v2 only version of a manifest application", func() {
   124  				Expect(executeErr).ToNot(HaveOccurred())
   125  				Expect(warnings).To(ConsistOf("v2-action-warnings"))
   126  				Expect(manifestApp).To(MatchFields(IgnoreExtras, Fields{
   127  					"Buildpack":  Equal(types.FilteredString{}),
   128  					"Buildpacks": ConsistOf("some-buildpack"),
   129  				}))
   130  			})
   131  		})
   132  	})
   133  
   134  	Context("when v2Actor.CreateManifestApplication fails", func() {
   135  		BeforeEach(func() {
   136  			fakeV2Actor.CreateApplicationManifestByNameAndSpaceReturns(manifest.Application{}, v2action.Warnings{"v2-action-warnings"}, errors.New("spaghetti"))
   137  		})
   138  
   139  		It("returns warnings and the error", func() {
   140  			Expect(executeErr).To(MatchError(errors.New("spaghetti")))
   141  			Expect(warnings).To(ConsistOf("v2-action-warnings"))
   142  		})
   143  	})
   144  })