github.com/swisscom/cloudfoundry-cli@v7.1.0+incompatible/cf/commands/buildpack/create_buildpack_test.go (about) 1 package buildpack_test 2 3 import ( 4 "fmt" 5 6 "code.cloudfoundry.org/cli/cf" 7 "code.cloudfoundry.org/cli/cf/api/apifakes" 8 "code.cloudfoundry.org/cli/cf/errors" 9 "code.cloudfoundry.org/cli/cf/requirements" 10 "code.cloudfoundry.org/cli/cf/requirements/requirementsfakes" 11 testcmd "code.cloudfoundry.org/cli/cf/util/testhelpers/commands" 12 testterm "code.cloudfoundry.org/cli/cf/util/testhelpers/terminal" 13 14 "code.cloudfoundry.org/cli/cf/commandregistry" 15 . "code.cloudfoundry.org/cli/cf/util/testhelpers/matchers" 16 . "github.com/onsi/ginkgo" 17 . "github.com/onsi/gomega" 18 ) 19 20 var _ = Describe("create-buildpack command", func() { 21 var ( 22 requirementsFactory *requirementsfakes.FakeFactory 23 repo *apifakes.OldFakeBuildpackRepository 24 bitsRepo *apifakes.FakeBuildpackBitsRepository 25 ui *testterm.FakeUI 26 deps commandregistry.Dependency 27 ) 28 29 updateCommandDependency := func(pluginCall bool) { 30 deps.UI = ui 31 deps.RepoLocator = deps.RepoLocator.SetBuildpackRepository(repo) 32 deps.RepoLocator = deps.RepoLocator.SetBuildpackBitsRepository(bitsRepo) 33 commandregistry.Commands.SetCommand(commandregistry.Commands.FindCommand("create-buildpack").SetDependency(deps, pluginCall)) 34 } 35 36 BeforeEach(func() { 37 requirementsFactory = new(requirementsfakes.FakeFactory) 38 requirementsFactory.NewLoginRequirementReturns(requirements.Passing{}) 39 repo = new(apifakes.OldFakeBuildpackRepository) 40 bitsRepo = new(apifakes.FakeBuildpackBitsRepository) 41 ui = &testterm.FakeUI{} 42 }) 43 44 It("fails requirements when the user is not logged in", func() { 45 requirementsFactory.NewLoginRequirementReturns(requirements.Failing{Message: "not logged in"}) 46 Expect(testcmd.RunCLICommand("create-buildpack", []string{"my-buildpack", "my-dir", "0"}, requirementsFactory, updateCommandDependency, false, ui)).To(BeFalse()) 47 }) 48 49 It("fails with usage when given fewer than three arguments", func() { 50 testcmd.RunCLICommand("create-buildpack", []string{}, requirementsFactory, updateCommandDependency, false, ui) 51 Expect(ui.Outputs()).To(ContainSubstrings( 52 []string{"Incorrect Usage", "Requires", "arguments"}, 53 )) 54 }) 55 56 Context("when a file is provided", func() { 57 It("prints error and do not call create buildpack", func() { 58 bitsRepo.CreateBuildpackZipFileReturns(nil, "", fmt.Errorf("create buildpack error")) 59 60 testcmd.RunCLICommand("create-buildpack", []string{"my-buildpack", "file", "5"}, requirementsFactory, updateCommandDependency, false, ui) 61 62 Expect(ui.Outputs()).To(ContainSubstrings([]string{"FAILED"})) 63 Expect(ui.Outputs()).To(ContainSubstrings([]string{"Failed to create a local temporary zip file for the buildpack"})) 64 Expect(ui.Outputs()).NotTo(ContainSubstrings([]string{"Creating buildpack"})) 65 66 }) 67 }) 68 69 Context("when a directory is provided", func() { 70 It("creates and uploads buildpacks", func() { 71 testcmd.RunCLICommand("create-buildpack", []string{"my-buildpack", "my.war", "5"}, requirementsFactory, updateCommandDependency, false, ui) 72 73 Expect(repo.CreateBuildpack.Enabled).To(BeNil()) 74 Expect(bitsRepo.CreateBuildpackZipFileCallCount()).To(Equal(1)) 75 buildpackPath := bitsRepo.CreateBuildpackZipFileArgsForCall(0) 76 Expect(buildpackPath).To(Equal("my.war")) 77 Expect(ui.Outputs()).To(ContainSubstrings( 78 []string{"Creating buildpack", "my-buildpack"}, 79 []string{"OK"}, 80 []string{"Uploading buildpack", "my-buildpack"}, 81 []string{"OK"}, 82 )) 83 Expect(ui.Outputs()).ToNot(ContainSubstrings([]string{"FAILED"})) 84 }) 85 }) 86 87 Context("when a URL is provided", func() { 88 It("creates and uploads buildpacks", func() { 89 testcmd.RunCLICommand("create-buildpack", []string{"my-buildpack", "https://some-url.com", "5"}, requirementsFactory, updateCommandDependency, false, ui) 90 91 Expect(repo.CreateBuildpack.Enabled).To(BeNil()) 92 Expect(bitsRepo.CreateBuildpackZipFileCallCount()).To(Equal(1)) 93 buildpackPath := bitsRepo.CreateBuildpackZipFileArgsForCall(0) 94 Expect(buildpackPath).To(Equal("https://some-url.com")) 95 Expect(ui.Outputs()).To(ContainSubstrings( 96 []string{"Creating buildpack", "my-buildpack"}, 97 []string{"OK"}, 98 []string{"Uploading buildpack", "my-buildpack"}, 99 []string{"OK"}, 100 )) 101 Expect(ui.Outputs()).ToNot(ContainSubstrings([]string{"FAILED"})) 102 }) 103 }) 104 105 It("warns the user when the buildpack with nil stack already exists", func() { 106 repo.CreateBuildpackWithNilStackExists = true 107 testcmd.RunCLICommand("create-buildpack", []string{"my-buildpack", "my.war", "5"}, requirementsFactory, updateCommandDependency, false, ui) 108 109 Expect(ui.Outputs()).To(ContainSubstrings( 110 []string{"Creating buildpack", "my-buildpack"}, 111 []string{"OK"}, 112 []string{"my-buildpack", "already exists without a stack"}, 113 []string{"TIP", "use", cf.Name, "delete-buildpack"}, 114 )) 115 Expect(ui.Outputs()).ToNot(ContainSubstrings([]string{"FAILED"})) 116 }) 117 118 It("warns the user when the buildpack with actual stack already exists", func() { 119 bitsRepo.UploadBuildpackReturns(errors.NewHTTPError(433, errors.BuildpackNameStackTaken, "test error")) 120 testcmd.RunCLICommand("create-buildpack", []string{"my-buildpack", "my.war", "5"}, requirementsFactory, updateCommandDependency, false, ui) 121 122 By("printing server error in UI because that's the only way to include the stack in the error message") 123 Expect(ui.Outputs()).To(ContainSubstrings( 124 []string{"Creating buildpack", "my-buildpack"}, 125 []string{"OK"}, 126 []string{"Uploading buildpack", "my-buildpack"}, 127 []string{"OK"}, 128 []string{"test error"}, 129 []string{"TIP", "use", cf.Name, "update-buildpack"}, 130 )) 131 Expect(ui.Outputs()).ToNot(ContainSubstrings([]string{"FAILED"})) 132 }) 133 134 It("enables the buildpack when given the --enabled flag", func() { 135 testcmd.RunCLICommand("create-buildpack", []string{"--enable", "my-buildpack", "my.war", "5"}, requirementsFactory, updateCommandDependency, false, ui) 136 137 Expect(*repo.CreateBuildpack.Enabled).To(Equal(true)) 138 }) 139 140 It("disables the buildpack when given the --disable flag", func() { 141 testcmd.RunCLICommand("create-buildpack", []string{"--disable", "my-buildpack", "my.war", "5"}, requirementsFactory, updateCommandDependency, false, ui) 142 143 Expect(*repo.CreateBuildpack.Enabled).To(Equal(false)) 144 }) 145 146 It("alerts the user when uploading the buildpack bits fails", func() { 147 bitsRepo.UploadBuildpackReturns(fmt.Errorf("upload error")) 148 149 testcmd.RunCLICommand("create-buildpack", []string{"my-buildpack", "bogus/path", "5"}, requirementsFactory, updateCommandDependency, false, ui) 150 151 Expect(ui.Outputs()).To(ContainSubstrings( 152 []string{"Creating buildpack", "my-buildpack"}, 153 []string{"OK"}, 154 []string{"Uploading buildpack"}, 155 []string{"FAILED"}, 156 )) 157 }) 158 })