github.com/sleungcy-sap/cli@v7.1.0+incompatible/integration/v7/global/update_buildpack_command_test.go (about)

     1  package global
     2  
     3  import (
     4  	"bytes"
     5  	"io/ioutil"
     6  	"log"
     7  	"net/http"
     8  	"os"
     9  	"regexp"
    10  
    11  	"code.cloudfoundry.org/cli/integration/helpers"
    12  	. "github.com/onsi/ginkgo"
    13  	. "github.com/onsi/gomega"
    14  	. "github.com/onsi/gomega/gbytes"
    15  	. "github.com/onsi/gomega/gexec"
    16  	. "github.com/onsi/gomega/ghttp"
    17  )
    18  
    19  var _ = Describe("update-buildpack command", func() {
    20  	var (
    21  		buildpackName string
    22  		username      string
    23  	)
    24  
    25  	BeforeEach(func() {
    26  		buildpackName = helpers.NewBuildpackName()
    27  		username, _ = helpers.GetCredentials()
    28  	})
    29  
    30  	When("--help flag is set", func() {
    31  		It("Displays command usage to output", func() {
    32  			session := helpers.CF("update-buildpack", "--help")
    33  			Eventually(session).Should(Say("NAME:"))
    34  			Eventually(session).Should(Say("update-buildpack - Update a buildpack"))
    35  			Eventually(session).Should(Say("USAGE:"))
    36  			Eventually(session).Should(Say(regexp.QuoteMeta(`cf update-buildpack BUILDPACK [-p PATH | -s STACK | --assign-stack NEW_STACK] [-i POSITION] [--rename NEW_NAME] [--enable|--disable] [--lock|--unlock]`)))
    37  			Eventually(session).Should(Say("TIP:"))
    38  			Eventually(session).Should(Say("Path should be a zip file, a url to a zip file, or a local directory. Position is a positive integer, sets priority, and is sorted from lowest to highest.\n\n"))
    39  			Eventually(session).Should(Say("Use '--assign-stack' with caution. Associating a buildpack with a stack that it does not support may result in undefined behavior. Additionally, changing this association once made may require a local copy of the buildpack.\n\n"))
    40  			Eventually(session).Should(Say("OPTIONS:"))
    41  			Eventually(session).Should(Say(`--assign-stack\s+Assign a stack to a buildpack that does not have a stack association`))
    42  			Eventually(session).Should(Say(`--disable\s+Disable the buildpack from being used for staging`))
    43  			Eventually(session).Should(Say(`--enable\s+Enable the buildpack to be used for staging`))
    44  			Eventually(session).Should(Say(`--lock\s+Lock the buildpack to prevent updates`))
    45  			Eventually(session).Should(Say(`--path, -p\s+Path to directory or zip file`))
    46  			Eventually(session).Should(Say(`--position, -i\s+The order in which the buildpacks are checked during buildpack auto-detection`))
    47  			Eventually(session).Should(Say(`--rename\s+Rename an existing buildpack`))
    48  			Eventually(session).Should(Say(`--stack, -s\s+Specify stack to disambiguate buildpacks with the same name`))
    49  			Eventually(session).Should(Say(`--unlock\s+Unlock the buildpack to enable updates`))
    50  			Eventually(session).Should(Say("SEE ALSO:"))
    51  			Eventually(session).Should(Say("buildpacks, create-buildpack, delete-buildpack"))
    52  			Eventually(session).Should(Exit(0))
    53  		})
    54  	})
    55  
    56  	When("the environment is not setup correctly", func() {
    57  		It("fails with the appropriate errors", func() {
    58  			helpers.CheckEnvironmentTargetedCorrectly(false, false, ReadOnlyOrg, "update-buildpack", "fake-buildpack")
    59  		})
    60  	})
    61  
    62  	When("the user is logged in", func() {
    63  		BeforeEach(func() {
    64  			helpers.LoginCF()
    65  		})
    66  
    67  		AfterEach(func() {
    68  			helpers.DeleteBuildpackIfOnOldCCAPI(buildpackName)
    69  		})
    70  
    71  		When("the buildpack is not provided", func() {
    72  			It("returns a buildpack argument not provided error", func() {
    73  				session := helpers.CF("update-buildpack", "-p", ".")
    74  
    75  				Eventually(session.Err).Should(Say("Incorrect Usage: the required argument `BUILDPACK` was not provided"))
    76  				Eventually(session).Should(Exit(1))
    77  			})
    78  		})
    79  
    80  		When("the buildpack name is provided", func() {
    81  			When("the buildpack does not exist", func() {
    82  				It("returns a buildpack not found error", func() {
    83  					session := helpers.CF("update-buildpack", buildpackName)
    84  					Eventually(session.Err).Should(Say("Buildpack '%s' not found", buildpackName))
    85  					Eventually(session).Should(Say("FAILED"))
    86  					Eventually(session).Should(Exit(1))
    87  				})
    88  			})
    89  
    90  			Describe("stack association", func() {
    91  				var stacks []string
    92  
    93  				BeforeEach(func() {
    94  					stacks = helpers.EnsureMinimumNumberOfStacks(2)
    95  				})
    96  
    97  				When("multiple buildpacks with the same name exist in enabled and unlocked state, and one has nil stack", func() {
    98  					BeforeEach(func() {
    99  						helpers.BuildpackWithStack(func(buildpackArchive string) {
   100  							createSession := helpers.CF("create-buildpack", buildpackName, buildpackArchive, "99")
   101  							Eventually(createSession).Should(Exit(0))
   102  						}, stacks[0])
   103  
   104  						helpers.BuildpackWithoutStack(func(buildpackArchive string) {
   105  							createSession := helpers.CF("create-buildpack", buildpackName, buildpackArchive, "100")
   106  							Eventually(createSession).Should(Exit(0))
   107  						})
   108  
   109  						listSession := helpers.CF("buildpacks")
   110  						Eventually(listSession).Should(Say(helpers.BuildpacksOutputRegex(helpers.BuildpackFields{
   111  							Name: buildpackName, Stack: stacks[0]})))
   112  						Eventually(listSession).Should(Say(helpers.BuildpacksOutputRegex(helpers.BuildpackFields{Name: buildpackName})))
   113  						Eventually(listSession).Should(Exit(0))
   114  					})
   115  
   116  					When("no stack association is specified", func() {
   117  						It("acts on the buildpack with the nil stack", func() {
   118  							session := helpers.CF("update-buildpack", buildpackName)
   119  
   120  							Eventually(session).Should(Say("Updating buildpack %s as %s...", buildpackName, username))
   121  							Eventually(session).Should(Say("OK"))
   122  							Eventually(session).Should(Exit(0))
   123  						})
   124  					})
   125  
   126  					When("the user specifies a stack association not matching any of the existing buildpacks with this name", func() {
   127  						It("reports that it couldn't find the buildpack", func() {
   128  							nonexistentStack := "some-incorrect-stack-name"
   129  							session := helpers.CF("update-buildpack", buildpackName, "-s", nonexistentStack)
   130  
   131  							Eventually(session.Err).Should(Say("Buildpack '%s' with stack '%s' not found", buildpackName, nonexistentStack))
   132  							Eventually(session).Should(Say("FAILED"))
   133  							Eventually(session).Should(Exit(1))
   134  						})
   135  					})
   136  
   137  					When("the user specifies a stack association matching one of the existing buildpacks with this name", func() {
   138  						It("finds the buildpack with the stack specified (and not the buildpack with the nil stack)", func() {
   139  							session := helpers.CF("update-buildpack", buildpackName, "-s", stacks[0])
   140  
   141  							Eventually(session).Should(Say("Updating buildpack %s with stack %s as %s...",
   142  								buildpackName, stacks[0], username,
   143  							))
   144  							Eventually(session).Should(Say("OK"))
   145  							Eventually(session).Should(Exit(0))
   146  						})
   147  					})
   148  				})
   149  
   150  				When("multiple buildpacks with the same name exist in enabled and unlocked state, and all have stacks", func() {
   151  					BeforeEach(func() {
   152  						helpers.BuildpackWithStack(func(buildpackArchive string) {
   153  							createSession := helpers.CF("create-buildpack", buildpackName, buildpackArchive, "98")
   154  							Eventually(createSession).Should(Exit(0))
   155  						}, stacks[0])
   156  
   157  						helpers.BuildpackWithStack(func(buildpackArchive string) {
   158  							createSession := helpers.CF("create-buildpack", buildpackName, buildpackArchive, "99")
   159  							Eventually(createSession).Should(Exit(0))
   160  						}, stacks[1])
   161  
   162  						listSession := helpers.CF("buildpacks")
   163  						Eventually(listSession).Should(Say(helpers.BuildpacksOutputRegex(helpers.BuildpackFields{
   164  							Name: buildpackName, Stack: stacks[0]})))
   165  						Eventually(listSession).Should(Say(helpers.BuildpacksOutputRegex(helpers.BuildpackFields{
   166  							Name: buildpackName, Stack: stacks[1]})))
   167  						Eventually(listSession).Should(Exit(0))
   168  					})
   169  
   170  					When("no stack association is specified", func() {
   171  						It("displays an error saying that multiple buildpacks were found", func() {
   172  							session := helpers.CF("update-buildpack", buildpackName)
   173  
   174  							Eventually(session.Err).Should(Say(`Multiple buildpacks named %s found\. Specify a stack name by using a '-s' flag\.`, buildpackName))
   175  							Eventually(session).Should(Say("FAILED"))
   176  							Eventually(session).Should(Exit(1))
   177  						})
   178  					})
   179  
   180  					When("the user specifies a stack association not matching any of the existing buildpacks with this name", func() {
   181  						It("reports that it couldn't find the buildpack", func() {
   182  							nonexistentStack := "some-incorrect-stack-name"
   183  							session := helpers.CF("update-buildpack", buildpackName, "-s", nonexistentStack)
   184  
   185  							Eventually(session.Err).Should(Say("Buildpack '%s' with stack '%s' not found", buildpackName, nonexistentStack))
   186  							Eventually(session).Should(Say("FAILED"))
   187  							Eventually(session).Should(Exit(1))
   188  						})
   189  					})
   190  
   191  					When("the user specifies a stack association matching one of the existing buildpacks with this name", func() {
   192  						It("finds the buildpack with the stack specified (and not the buildpack with the other stack)", func() {
   193  							session := helpers.CF("update-buildpack", buildpackName, "-s", stacks[0])
   194  
   195  							Eventually(session).Should(Say("Updating buildpack %s with stack %s as %s...",
   196  								buildpackName, stacks[0], username,
   197  							))
   198  							Eventually(session).Should(Say("OK"))
   199  							Eventually(session).Should(Exit(0))
   200  						})
   201  					})
   202  				})
   203  
   204  				When("one buildpack with the given name exists in enabled and unlocked state with a stack association", func() {
   205  					BeforeEach(func() {
   206  						helpers.BuildpackWithStack(func(buildpackArchive string) {
   207  							createSession := helpers.CF("create-buildpack", buildpackName, buildpackArchive, "99")
   208  							Eventually(createSession).Should(Exit(0))
   209  						}, stacks[0])
   210  
   211  						listSession := helpers.CF("buildpacks")
   212  						Eventually(listSession).Should(Say(helpers.BuildpacksOutputRegex(helpers.BuildpackFields{
   213  							Name: buildpackName, Stack: stacks[0]})))
   214  						Eventually(listSession).Should(Exit(0))
   215  					})
   216  
   217  					When("no stack association is specified", func() {
   218  						It("updates the only buildpack with that name", func() {
   219  							session := helpers.CF("update-buildpack", buildpackName)
   220  
   221  							Eventually(session).Should(Say("Updating buildpack %s as %s...", buildpackName, username))
   222  							Eventually(session).Should(Say("OK"))
   223  							Eventually(session).Should(Exit(0))
   224  						})
   225  					})
   226  
   227  					When("the user specifies a stack association matching the buildpack with this name", func() {
   228  						It("finds the buildpack with the stack specified", func() {
   229  							session := helpers.CF("update-buildpack", buildpackName, "-s", stacks[0])
   230  
   231  							Eventually(session).Should(Say("Updating buildpack %s with stack %s as %s...",
   232  								buildpackName, stacks[0], username,
   233  							))
   234  							Eventually(session).Should(Say("OK"))
   235  							Eventually(session).Should(Exit(0))
   236  						})
   237  					})
   238  				})
   239  			})
   240  
   241  			When("one buildpack with given name exists in enabled and unlocked state with no stack association", func() {
   242  				BeforeEach(func() {
   243  					helpers.BuildpackWithoutStack(func(buildpackArchive string) {
   244  						createSession := helpers.CF("create-buildpack", buildpackName, buildpackArchive, "99")
   245  						Eventually(createSession).Should(Exit(0))
   246  					})
   247  
   248  					listSession := helpers.CF("buildpacks")
   249  					Eventually(listSession).Should(Say(helpers.BuildpacksOutputRegex(helpers.BuildpackFields{Name: buildpackName})))
   250  					Eventually(listSession).Should(Exit(0))
   251  				})
   252  
   253  				When("only a name is provided", func() {
   254  					It("prints a success message", func() {
   255  						session := helpers.CF("update-buildpack", buildpackName)
   256  
   257  						Eventually(session).Should(Say("Updating buildpack %s as %s...", buildpackName, username))
   258  						Eventually(session).Should(Say("OK"))
   259  						Eventually(session).Should(Exit(0))
   260  					})
   261  				})
   262  
   263  				When("the -s flag is provided", func() {
   264  					var (
   265  						stackName string
   266  						session   *Session
   267  					)
   268  
   269  					JustBeforeEach(func() {
   270  						stackName = "some-stack"
   271  						session = helpers.CF("update-buildpack", buildpackName, "-s", stackName)
   272  					})
   273  
   274  					It("returns a buildpack with stack not found error", func() {
   275  						Eventually(session.Err).Should(Say("Buildpack '%s' with stack '%s' not found", buildpackName, stackName))
   276  						Eventually(session).Should(Say("FAILED"))
   277  						Eventually(session).Should(Exit(1))
   278  					})
   279  				})
   280  
   281  				When("the -p flag is provided", func() {
   282  					var (
   283  						buildpackPath string
   284  						session       *Session
   285  					)
   286  
   287  					JustBeforeEach(func() {
   288  						session = helpers.CF("update-buildpack", buildpackName, "-p", buildpackPath)
   289  					})
   290  
   291  					When("the path is local", func() {
   292  						When("the buildpack path exists", func() {
   293  							When("the buildpack path is an empty directory", func() {
   294  								BeforeEach(func() {
   295  									var err error
   296  									buildpackPath, err = ioutil.TempDir("", "create-buildpack-test-")
   297  									Expect(err).ToNot(HaveOccurred())
   298  								})
   299  
   300  								AfterEach(func() {
   301  									err := os.RemoveAll(buildpackPath)
   302  									Expect(err).ToNot(HaveOccurred())
   303  								})
   304  
   305  								It("prints an error message", func() {
   306  									Eventually(session).Should(Say("Updating buildpack %s as %s...", buildpackName, username))
   307  									Eventually(session.Err).Should(Say("The specified path '%s' cannot be an empty directory.", regexp.QuoteMeta(buildpackPath)))
   308  									Eventually(session).Should(Exit(1))
   309  								})
   310  							})
   311  
   312  							When("the path is a buildpack directory", func() {
   313  								BeforeEach(func() {
   314  									var err error
   315  									buildpackPath, err = ioutil.TempDir("", "create-buildpack-test-")
   316  									Expect(err).ToNot(HaveOccurred())
   317  									file, err := ioutil.TempFile(buildpackPath, "")
   318  									Expect(err).ToNot(HaveOccurred())
   319  									defer file.Close()
   320  								})
   321  
   322  								AfterEach(func() {
   323  									err := os.RemoveAll(buildpackPath)
   324  									Expect(err).ToNot(HaveOccurred())
   325  								})
   326  
   327  								It("updates the buildpack with the given bits", func() {
   328  									Eventually(session).Should(Say("Updating buildpack %s as %s...", buildpackName, username))
   329  									Eventually(session).Should(Say("OK"))
   330  									Eventually(session).Should(Exit(0))
   331  								})
   332  							})
   333  
   334  							When("uploading from a zip", func() {
   335  								BeforeEach(func() {
   336  									buildpackPath = helpers.MakeBuildpackArchive("")
   337  								})
   338  
   339  								AfterEach(func() {
   340  									err := os.Remove(buildpackPath)
   341  									Expect(err).NotTo(HaveOccurred())
   342  								})
   343  
   344  								It("updates the buildpack with the given bits", func() {
   345  									Eventually(session).Should(Say("Updating buildpack %s as %s...", buildpackName, username))
   346  									Eventually(session).Should(Say("OK"))
   347  									Eventually(session).Should(Exit(0))
   348  								})
   349  							})
   350  						})
   351  
   352  						When("the buildpack path does not exist", func() {
   353  							BeforeEach(func() {
   354  								buildpackPath = "this-is-a-bogus-path"
   355  							})
   356  
   357  							It("returns a buildpack does not exist error", func() {
   358  								Eventually(session.Err).Should(Say("Incorrect Usage: The specified path 'this-is-a-bogus-path' does not exist."))
   359  								Eventually(session).Should(Exit(1))
   360  							})
   361  						})
   362  					})
   363  
   364  					When("path is a URL", func() {
   365  						When("specifying a valid URL", func() {
   366  							BeforeEach(func() {
   367  								buildpackPath = "https://github.com/cloudfoundry/binary-buildpack/releases/download/v1.0.21/binary-buildpack-v1.0.21.zip"
   368  							})
   369  
   370  							It("successfully uploads a buildpack", func() {
   371  								Eventually(session).Should(Say("Updating buildpack %s as %s...", buildpackName, username))
   372  								Eventually(session).Should(Say("OK"))
   373  								Eventually(session).Should(Say("Uploading buildpack %s as %s...", buildpackName, username))
   374  								Eventually(session).Should(Say("OK"))
   375  								Eventually(session).Should(Exit(0))
   376  							})
   377  						})
   378  
   379  						When("a 4xx or 5xx HTTP response status is encountered", func() {
   380  							var server *Server
   381  
   382  							BeforeEach(func() {
   383  								server = NewServer()
   384  								// Suppresses ginkgo server logs
   385  								server.HTTPTestServer.Config.ErrorLog = log.New(&bytes.Buffer{}, "", 0)
   386  								server.AppendHandlers(
   387  									CombineHandlers(
   388  										VerifyRequest(http.MethodGet, "/"),
   389  										RespondWith(http.StatusNotFound, nil),
   390  									),
   391  								)
   392  								buildpackPath = server.URL()
   393  							})
   394  
   395  							AfterEach(func() {
   396  								server.Close()
   397  							})
   398  
   399  							It("displays an appropriate error", func() {
   400  								Eventually(session.Err).Should(Say("Download attempt failed; server returned 404 Not Found"))
   401  								Eventually(session.Err).Should(Say(`Unable to install; buildpack is not available from the given URL\.`))
   402  								Eventually(session).Should(Say("FAILED"))
   403  								Eventually(session).Should(Exit(1))
   404  							})
   405  						})
   406  
   407  						When("specifying an invalid URL", func() {
   408  							BeforeEach(func() {
   409  								buildpackPath = "http://not-a-real-url"
   410  							})
   411  
   412  							It("returns the appropriate error", func() {
   413  								Eventually(session.Err).Should(Say("Get %s: dial tcp: lookup", buildpackPath))
   414  								Eventually(session).Should(Say("FAILED"))
   415  								Eventually(session).Should(Exit(1))
   416  							})
   417  						})
   418  					})
   419  				})
   420  
   421  				When("the -i flag is provided", func() {
   422  					// TODO: These are tests that require global integration scoping, break these into their own test and isolate the others
   423  					var (
   424  						buildpackPosition string
   425  						session           *Session
   426  					)
   427  
   428  					JustBeforeEach(func() {
   429  						session = helpers.CF("update-buildpack", buildpackName, "-i", buildpackPosition)
   430  					})
   431  
   432  					When("position is a negative integer", func() {
   433  						BeforeEach(func() {
   434  							buildpackPosition = "-3"
   435  						})
   436  
   437  						It("fails with error that position must be at least 1", func() {
   438  							Eventually(session).Should(Say("Updating buildpack %s as %s...", buildpackName, username))
   439  							Eventually(session.Err).Should(Say("Position must be greater than or equal to 1"))
   440  							Eventually(session).Should(Exit(1))
   441  						})
   442  					})
   443  
   444  					When("position is positive integer", func() {
   445  						BeforeEach(func() {
   446  							buildpackPosition = "3"
   447  						})
   448  
   449  						It("successfully uploads buildpack in the provided position", func() {
   450  							Eventually(session).Should(Exit(0))
   451  
   452  							listSession := helpers.CF("buildpacks")
   453  							Eventually(listSession).Should(Say(`\s+3\s+%s`, buildpackName))
   454  							Eventually(listSession).Should(Exit(0))
   455  						})
   456  					})
   457  				})
   458  
   459  				When("the --assign-stack flag is provided", func() {
   460  					var (
   461  						stacks []string
   462  					)
   463  
   464  					When("the user assigns a stack that exists on the system", func() {
   465  						BeforeEach(func() {
   466  							stacks = helpers.EnsureMinimumNumberOfStacks(2)
   467  						})
   468  
   469  						It("successfully assigns the stack to the buildpack", func() {
   470  							session := helpers.CF("update-buildpack", buildpackName, "--assign-stack", stacks[0])
   471  
   472  							Eventually(session).Should(Say("Assigning stack %s to %s as %s...", stacks[0], buildpackName, username))
   473  							Eventually(session).Should(Say("OK"))
   474  							Eventually(session).Should(Exit(0))
   475  
   476  							listSession := helpers.CF("buildpacks")
   477  							Eventually(listSession).Should(Say(helpers.BuildpacksOutputRegex(helpers.BuildpackFields{
   478  								Name: buildpackName, Stack: stacks[0]})))
   479  							Eventually(listSession).Should(Exit(0))
   480  						})
   481  
   482  						When("the buildpack already has a stack associated to it", func() {
   483  							BeforeEach(func() {
   484  								assignStackSession := helpers.CF("update-buildpack", buildpackName, "--assign-stack", stacks[0])
   485  								Eventually(assignStackSession).Should(Exit(0))
   486  							})
   487  
   488  							It("displays an error that the buildpack already has a stack association", func() {
   489  								session := helpers.CF("update-buildpack", buildpackName, "--assign-stack", stacks[1])
   490  								Eventually(session.Err).Should(Say("Buildpack stack cannot be changed"))
   491  								Eventually(session).Should(Say("FAILED"))
   492  								Eventually(session).Should(Exit(1))
   493  							})
   494  						})
   495  					})
   496  
   497  					When("the user assigns a stack that does NOT exist on the system", func() {
   498  						It("displays an error that the stack isn't found", func() {
   499  							session := helpers.CF("update-buildpack", buildpackName, "--assign-stack", "nonexistent-stack")
   500  							Eventually(session.Err).Should(Say("Stack 'nonexistent-stack' does not exist"))
   501  							Eventually(session).Should(Say("FAILED"))
   502  							Eventually(session).Should(Exit(1))
   503  						})
   504  					})
   505  				})
   506  
   507  				When("the --lock is provided", func() {
   508  					It("locks the buildpack", func() {
   509  						session := helpers.CF("update-buildpack", buildpackName, "--lock")
   510  						Eventually(session).Should(Say("Updating buildpack %s as %s...", buildpackName, username))
   511  						Eventually(session).Should(Say("OK"))
   512  						Eventually(session).Should(Exit(0))
   513  
   514  						session = helpers.CF("buildpacks")
   515  						Eventually(session).Should(Say(helpers.BuildpacksOutputRegex(helpers.BuildpackFields{
   516  							Name:   buildpackName,
   517  							Locked: "true",
   518  						})))
   519  						Eventually(session).Should(Exit(0))
   520  					})
   521  				})
   522  
   523  				When("the --disable is provided", func() {
   524  					It("disables buildpack", func() {
   525  						session := helpers.CF("update-buildpack", buildpackName, "--disable")
   526  						Eventually(session).Should(Say("Updating buildpack %s as %s...", buildpackName, username))
   527  						Eventually(session).Should(Say("OK"))
   528  						Eventually(session).Should(Exit(0))
   529  
   530  						session = helpers.CF("buildpacks")
   531  						Eventually(session).Should(Say(`%s\s+false`, buildpackName))
   532  						Eventually(session).Should(Exit(0))
   533  					})
   534  				})
   535  
   536  				When("the --rename flag is provided", func() {
   537  					var (
   538  						newBuildpackName string
   539  					)
   540  
   541  					BeforeEach(func() {
   542  						newBuildpackName = helpers.NewBuildpackName()
   543  					})
   544  
   545  					When("a buildpack with the new name does not already exist", func() {
   546  						It("renames the buildpack", func() {
   547  							session := helpers.CF("update-buildpack", buildpackName, "--rename", newBuildpackName)
   548  							Eventually(session).Should(Say("Renaming buildpack %s to %s as %s...", buildpackName, newBuildpackName, username))
   549  							Eventually(session).Should(Say("OK"))
   550  							Eventually(session).Should(Exit(0))
   551  
   552  							session = helpers.CF("buildpacks")
   553  							Eventually(session).Should(Say(`%s`, newBuildpackName))
   554  							Eventually(session).ShouldNot(Say(`%s`, buildpackName))
   555  							Eventually(session).Should(Exit(0))
   556  						})
   557  					})
   558  
   559  					When("a buildpack with the new name already exists", func() {
   560  						BeforeEach(func() {
   561  							helpers.BuildpackWithoutStack(func(buildpackArchive string) {
   562  								createSession := helpers.CF("create-buildpack", newBuildpackName, buildpackArchive, "99")
   563  								Eventually(createSession).Should(Exit(0))
   564  							})
   565  
   566  							listSession := helpers.CF("buildpacks")
   567  							Eventually(listSession).Should(Say(helpers.BuildpacksOutputRegex(helpers.BuildpackFields{Name: newBuildpackName})))
   568  							Eventually(listSession).Should(Exit(0))
   569  						})
   570  
   571  						It("fails to rename the buildpack", func() {
   572  							session := helpers.CF("update-buildpack", buildpackName, "--rename", newBuildpackName)
   573  							Eventually(session.Err).Should(Say("Buildpack with name '%s' and an unassigned stack already exists", newBuildpackName))
   574  							Eventually(session).Should(Say("FAILED"))
   575  							Eventually(session).Should(Exit(1))
   576  						})
   577  					})
   578  				})
   579  			})
   580  
   581  			When("the buildpack exists and is disabled", func() {
   582  				BeforeEach(func() {
   583  					helpers.BuildpackWithoutStack(func(buildpackPath string) {
   584  						session := helpers.CF("create-buildpack", buildpackName, buildpackPath, "1", "--disable")
   585  						Eventually(session).Should(Exit(0))
   586  					})
   587  				})
   588  
   589  				When("specifying enable flag", func() {
   590  					It("enables buildpack", func() {
   591  						session := helpers.CF("update-buildpack", buildpackName, "--enable")
   592  						Eventually(session).Should(Say("Updating buildpack %s as %s...", buildpackName, username))
   593  						Eventually(session).Should(Say("OK"))
   594  						Eventually(session).Should(Exit(0))
   595  
   596  						session = helpers.CF("buildpacks")
   597  						Eventually(session).Should(Say(helpers.BuildpacksOutputRegex(helpers.BuildpackFields{Name: buildpackName})))
   598  						Eventually(session).Should(Exit(0))
   599  					})
   600  				})
   601  			})
   602  
   603  			When("the buildpack exists and is locked", func() {
   604  				var buildpackURL string
   605  
   606  				BeforeEach(func() {
   607  					helpers.BuildpackWithoutStack(func(buildpackPath string) {
   608  						session := helpers.CF("create-buildpack", buildpackName, buildpackPath, "1")
   609  						Eventually(session).Should(Exit(0))
   610  						session = helpers.CF("update-buildpack", buildpackName, "--lock")
   611  						Eventually(session).Should(Exit(0))
   612  					})
   613  					buildpackURL = "https://github.com/cloudfoundry/binary-buildpack/releases/download/v1.0.21/binary-buildpack-v1.0.21.zip"
   614  				})
   615  
   616  				Context("specifying -p argument", func() {
   617  					It("fails to update buildpack", func() {
   618  						session := helpers.CF("update-buildpack", buildpackName, "-p", buildpackURL)
   619  						Eventually(session).Should(Say("Updating buildpack %s as %s...", buildpackName, username))
   620  						Eventually(session).Should(Say("FAILED"))
   621  						Eventually(session.Err).Should(Say("Buildpack is locked"))
   622  						Eventually(session).Should(Exit(1))
   623  					})
   624  				})
   625  
   626  				Context("specifying unlock flag", func() {
   627  					It("unlocks the buildpack", func() {
   628  						session := helpers.CF("update-buildpack", buildpackName, "--unlock")
   629  						Eventually(session).Should(Say("Updating buildpack %s as %s...", buildpackName, username))
   630  						Eventually(session).Should(Say("OK"))
   631  						Eventually(session).Should(Exit(0))
   632  
   633  						session = helpers.CF("buildpacks")
   634  						Eventually(session).Should(Say(helpers.BuildpacksOutputRegex(helpers.BuildpackFields{Name: buildpackName})))
   635  						Eventually(session).Should(Exit(0))
   636  					})
   637  				})
   638  			})
   639  		})
   640  	})
   641  })