github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/command/v6/rename_buildpack_command_test.go (about)

     1  package v6_test
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/actor/actionerror"
     5  	"code.cloudfoundry.org/cli/actor/v2action"
     6  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccversion"
     7  	"code.cloudfoundry.org/cli/command/commandfakes"
     8  	"code.cloudfoundry.org/cli/command/flag"
     9  	"code.cloudfoundry.org/cli/command/translatableerror"
    10  	. "code.cloudfoundry.org/cli/command/v6"
    11  	"code.cloudfoundry.org/cli/command/v6/v6fakes"
    12  	"code.cloudfoundry.org/cli/util/configv3"
    13  	"code.cloudfoundry.org/cli/util/ui"
    14  	. "github.com/onsi/ginkgo"
    15  	. "github.com/onsi/gomega"
    16  	. "github.com/onsi/gomega/gbytes"
    17  )
    18  
    19  var _ = Describe("rename buildpack command", func() {
    20  	var (
    21  		cmd             RenameBuildpackCommand
    22  		fakeActor       *v6fakes.FakeRenameBuildpackActor
    23  		fakeConfig      *commandfakes.FakeConfig
    24  		fakeSharedActor *commandfakes.FakeSharedActor
    25  		testUI          *ui.UI
    26  		executeErr      error
    27  	)
    28  
    29  	BeforeEach(func() {
    30  		testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
    31  		fakeConfig = new(commandfakes.FakeConfig)
    32  		fakeSharedActor = new(commandfakes.FakeSharedActor)
    33  		fakeActor = new(v6fakes.FakeRenameBuildpackActor)
    34  
    35  		cmd = RenameBuildpackCommand{
    36  			UI:          testUI,
    37  			Actor:       fakeActor,
    38  			Config:      fakeConfig,
    39  			SharedActor: fakeSharedActor,
    40  		}
    41  	})
    42  
    43  	JustBeforeEach(func() {
    44  		executeErr = cmd.Execute(nil)
    45  	})
    46  
    47  	When("checking the target fails", func() {
    48  		var binaryName string
    49  
    50  		BeforeEach(func() {
    51  			binaryName = "faceman"
    52  			fakeConfig.BinaryNameReturns(binaryName)
    53  			fakeSharedActor.CheckTargetReturns(actionerror.NotLoggedInError{BinaryName: binaryName})
    54  		})
    55  
    56  		It("returns an error", func() {
    57  			Expect(executeErr).To(MatchError(actionerror.NotLoggedInError{BinaryName: "faceman"}))
    58  			Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
    59  			checkTargetedOrg, checkTargetedSpace := fakeSharedActor.CheckTargetArgsForCall(0)
    60  			Expect(checkTargetedOrg).To(BeFalse())
    61  			Expect(checkTargetedSpace).To(BeFalse())
    62  		})
    63  	})
    64  
    65  	When("checking the target succeeds", func() {
    66  		var (
    67  			oldName   string
    68  			newName   string
    69  			stackName string
    70  			userName  string
    71  		)
    72  
    73  		BeforeEach(func() {
    74  			oldName = "some-old-name"
    75  			newName = "some-new-name"
    76  			stackName = "some-stack"
    77  			userName = "some-user"
    78  
    79  			cmd.RequiredArgs = flag.RenameBuildpackArgs{
    80  				OldBuildpackName: oldName,
    81  				NewBuildpackName: newName,
    82  			}
    83  
    84  			fakeConfig.CurrentUserReturns(configv3.User{Name: userName}, nil)
    85  		})
    86  
    87  		When("the user does not specify a stack", func() {
    88  			When("no error is returned", func() {
    89  				BeforeEach(func() {
    90  					fakeActor.RenameBuildpackReturns(v2action.Warnings{"warning1", "warning2"}, nil)
    91  				})
    92  
    93  				It("successfully renames the buildpack and displays any warnings", func() {
    94  					Expect(executeErr).ToNot(HaveOccurred())
    95  
    96  					Expect(fakeActor.RenameBuildpackCallCount()).To(Equal(1))
    97  
    98  					oldBuildpackName, newBuildpackName, stack := fakeActor.RenameBuildpackArgsForCall(0)
    99  					Expect(oldBuildpackName).To(Equal(oldName))
   100  					Expect(newBuildpackName).To(Equal(newName))
   101  					Expect(stack).To(BeEmpty())
   102  
   103  					Expect(testUI.Out).To(Say("Renaming buildpack %s to %s as %s...", oldName, newName, userName))
   104  					Expect(testUI.Err).To(Say("warning1"))
   105  					Expect(testUI.Err).To(Say("warning2"))
   106  				})
   107  			})
   108  
   109  			When("an error is returned", func() {
   110  				BeforeEach(func() {
   111  					fakeActor.RenameBuildpackReturns(
   112  						v2action.Warnings{"warning1", "warning2"},
   113  						actionerror.BuildpackNameTakenError{Name: newName})
   114  				})
   115  
   116  				It("returns an error and prints warnings", func() {
   117  					Expect(executeErr).To(MatchError(actionerror.BuildpackNameTakenError{Name: newName}))
   118  					Expect(testUI.Err).To(Say("warning1"))
   119  					Expect(testUI.Err).To(Say("warning2"))
   120  				})
   121  			})
   122  		})
   123  
   124  		When("the user specifies a stack", func() {
   125  			BeforeEach(func() {
   126  				cmd.Stack = stackName
   127  			})
   128  
   129  			When("the version of CC API is less than minimum version", func() {
   130  				BeforeEach(func() {
   131  					fakeActor.CloudControllerAPIVersionReturns(ccversion.MinSupportedV2ClientVersion)
   132  				})
   133  
   134  				It("should warn the user that the version of CAPI is too low and exit with an error", func() {
   135  					Expect(executeErr).To(MatchError(translatableerror.MinimumCFAPIVersionNotMetError{
   136  						Command:        "Option '-s'",
   137  						CurrentVersion: ccversion.MinSupportedV2ClientVersion,
   138  						MinimumVersion: ccversion.MinVersionBuildpackStackAssociationV2,
   139  					}))
   140  				})
   141  			})
   142  
   143  			When("the version of the CC API greater than/equal too the minimum version", func() {
   144  				BeforeEach(func() {
   145  					fakeActor.CloudControllerAPIVersionReturns(ccversion.MinVersionBuildpackStackAssociationV2)
   146  				})
   147  
   148  				When("the actor succeeds", func() {
   149  					BeforeEach(func() {
   150  						fakeActor.RenameBuildpackReturns(v2action.Warnings{"warning1", "warning2"}, nil)
   151  					})
   152  
   153  					It("successfully renames the buildpack and displays any warnings", func() {
   154  						Expect(executeErr).ToNot(HaveOccurred())
   155  
   156  						Expect(fakeActor.RenameBuildpackCallCount()).To(Equal(1))
   157  
   158  						oldBuildpackName, newBuildpackName, stack := fakeActor.RenameBuildpackArgsForCall(0)
   159  						Expect(oldBuildpackName).To(Equal(oldName))
   160  						Expect(newBuildpackName).To(Equal(newName))
   161  						Expect(stack).To(Equal(stackName))
   162  
   163  						Expect(testUI.Out).To(Say("Renaming buildpack %s to %s with stack %s as %s...",
   164  							oldName,
   165  							newName,
   166  							stackName,
   167  							userName,
   168  						))
   169  						Expect(testUI.Err).To(Say("warning1"))
   170  						Expect(testUI.Err).To(Say("warning2"))
   171  					})
   172  				})
   173  
   174  				When("the actor returns an error", func() {
   175  					When("BuildpackNameTakenError", func() {
   176  						BeforeEach(func() {
   177  							fakeActor.RenameBuildpackReturns(
   178  								v2action.Warnings{"warning1", "warning2"},
   179  								actionerror.BuildpackNameTakenError{Name: newName})
   180  						})
   181  
   182  						It("returns an error and prints warnings", func() {
   183  							Expect(executeErr).To(MatchError(actionerror.BuildpackNameTakenError{Name: newName}))
   184  							Expect(testUI.Err).To(Say("warning1"))
   185  							Expect(testUI.Err).To(Say("warning2"))
   186  						})
   187  					})
   188  
   189  					When("BuildpackInvalidError: name has invalid characters", func() {
   190  						BeforeEach(func() {
   191  							fakeActor.RenameBuildpackReturns(
   192  								v2action.Warnings{"warning1", "warning2"},
   193  								actionerror.BuildpackInvalidError{Message: "Buildpack is invalid: name can only contain alphanumeric characters"})
   194  						})
   195  
   196  						It("returns an error and prints warnings", func() {
   197  							Expect(executeErr).To(MatchError(actionerror.BuildpackInvalidError{Message: "Buildpack is invalid: name can only contain alphanumeric characters"}))
   198  							Expect(testUI.Err).To(Say("warning1"))
   199  							Expect(testUI.Err).To(Say("warning2"))
   200  						})
   201  					})
   202  
   203  					When("BuildpackInvalidError: stack non-unique", func() {
   204  						BeforeEach(func() {
   205  							fakeActor.RenameBuildpackReturns(
   206  								v2action.Warnings{"warning1", "warning2"},
   207  								actionerror.BuildpackInvalidError{Message: "Buildpack is invalid: stack unique"})
   208  						})
   209  
   210  						It("returns an error and prints warnings", func() {
   211  							Expect(executeErr).To(MatchError("Buildpack some-new-name already exists without a stack"))
   212  							Expect(testUI.Err).To(Say("warning1"))
   213  							Expect(testUI.Err).To(Say("warning2"))
   214  						})
   215  					})
   216  				})
   217  			})
   218  		})
   219  	})
   220  })