github.com/loafoe/cli@v7.1.0+incompatible/command/v7/download_droplet_command_test.go (about) 1 package v7_test 2 3 import ( 4 "errors" 5 "io/ioutil" 6 "os" 7 "path/filepath" 8 "regexp" 9 10 "code.cloudfoundry.org/cli/actor/actionerror" 11 "code.cloudfoundry.org/cli/actor/v7action" 12 "code.cloudfoundry.org/cli/command/commandfakes" 13 "code.cloudfoundry.org/cli/command/translatableerror" 14 . "code.cloudfoundry.org/cli/command/v7" 15 "code.cloudfoundry.org/cli/command/v7/v7fakes" 16 "code.cloudfoundry.org/cli/util/configv3" 17 "code.cloudfoundry.org/cli/util/ui" 18 19 . "github.com/onsi/ginkgo" 20 . "github.com/onsi/gomega" 21 . "github.com/onsi/gomega/gbytes" 22 ) 23 24 var _ = Describe("download-droplet Command", func() { 25 26 var ( 27 cmd DownloadDropletCommand 28 testUI *ui.UI 29 fakeConfig *commandfakes.FakeConfig 30 fakeSharedActor *commandfakes.FakeSharedActor 31 fakeActor *v7fakes.FakeActor 32 binaryName string 33 executeErr error 34 ) 35 36 BeforeEach(func() { 37 testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer()) 38 fakeConfig = new(commandfakes.FakeConfig) 39 fakeSharedActor = new(commandfakes.FakeSharedActor) 40 fakeActor = new(v7fakes.FakeActor) 41 42 cmd = DownloadDropletCommand{ 43 BaseCommand: BaseCommand{ 44 UI: testUI, 45 Config: fakeConfig, 46 SharedActor: fakeSharedActor, 47 Actor: fakeActor, 48 }, 49 } 50 51 cmd.RequiredArgs.AppName = "some-app" 52 53 binaryName = "faceman" 54 fakeConfig.BinaryNameReturns(binaryName) 55 fakeConfig.HasTargetedOrganizationReturns(true) 56 fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "some-org"}) 57 fakeConfig.HasTargetedSpaceReturns(true) 58 fakeConfig.TargetedSpaceReturns(configv3.Space{ 59 GUID: "some-space-guid", 60 Name: "some-space"}) 61 fakeConfig.CurrentUserReturns( 62 configv3.User{Name: "some-user"}, 63 nil) 64 }) 65 66 JustBeforeEach(func() { 67 executeErr = cmd.Execute(nil) 68 }) 69 70 When("checking target fails", func() { 71 BeforeEach(func() { 72 fakeSharedActor.CheckTargetReturns(actionerror.NotLoggedInError{BinaryName: binaryName}) 73 }) 74 75 It("returns an error if the check fails", func() { 76 Expect(executeErr).To(MatchError(actionerror.NotLoggedInError{BinaryName: "faceman"})) 77 78 Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1)) 79 checkTargetedOrg, checkTargetedSpace := fakeSharedActor.CheckTargetArgsForCall(0) 80 Expect(checkTargetedOrg).To(BeTrue()) 81 Expect(checkTargetedSpace).To(BeTrue()) 82 }) 83 }) 84 85 When("downloading the droplet succeeds", func() { 86 var pathToDropletFile string 87 88 BeforeEach(func() { 89 fakeActor.DownloadCurrentDropletByAppNameReturns([]byte("some-droplet"), "some-droplet-guid", v7action.Warnings{"some-warning"}, nil) 90 91 currentDir, _ := os.Getwd() 92 pathToDropletFile = filepath.Join(currentDir, "droplet_some-droplet-guid.tgz") 93 }) 94 95 AfterEach(func() { 96 Expect(os.Remove(pathToDropletFile)).ToNot(HaveOccurred()) 97 }) 98 99 It("creates a droplet tarball in the current directory", func() { 100 Expect(executeErr).ToNot(HaveOccurred()) 101 102 Expect(fakeActor.DownloadCurrentDropletByAppNameCallCount()).To(Equal(1)) 103 appArg, spaceGUIDArg := fakeActor.DownloadCurrentDropletByAppNameArgsForCall(0) 104 Expect(appArg).To(Equal("some-app")) 105 Expect(spaceGUIDArg).To(Equal("some-space-guid")) 106 107 fileContents, err := ioutil.ReadFile(pathToDropletFile) 108 Expect(err).ToNot(HaveOccurred()) 109 Expect(string(fileContents)).To(Equal("some-droplet")) 110 }) 111 112 It("displays the file it created and returns no errors", func() { 113 Expect(testUI.Out).To(Say("Downloading current droplet for app some-app in org some-org / space some-space as some-user...")) 114 Expect(testUI.Err).To(Say("some-warning")) 115 Expect(testUI.Out).To(Say(`Droplet downloaded successfully at .*droplet_some-droplet-guid.tgz`)) 116 Expect(testUI.Out).To(Say("OK")) 117 Expect(executeErr).ToNot(HaveOccurred()) 118 }) 119 }) 120 121 When("the droplet guid is passed in", func() { 122 var pathToDropletFile string 123 124 BeforeEach(func() { 125 cmd.Droplet = "some-droplet-guid" 126 fakeActor.DownloadDropletByGUIDAndAppNameReturns([]byte("some-droplet"), v7action.Warnings{"some-warning"}, nil) 127 128 pathToDropletFile = filepath.Join("droplet_some-droplet-guid.tgz") 129 }) 130 131 AfterEach(func() { 132 Expect(os.Remove("droplet_some-droplet-guid.tgz")).ToNot(HaveOccurred()) 133 }) 134 135 It("creates a droplet tarball in the current directory", func() { 136 Expect(executeErr).ToNot(HaveOccurred()) 137 138 Expect(fakeActor.DownloadDropletByGUIDAndAppNameCallCount()).To(Equal(1)) 139 dropletGUIDArg, appArg, spaceGUIDArg := fakeActor.DownloadDropletByGUIDAndAppNameArgsForCall(0) 140 Expect(dropletGUIDArg).To(Equal("some-droplet-guid")) 141 Expect(appArg).To(Equal("some-app")) 142 Expect(spaceGUIDArg).To(Equal("some-space-guid")) 143 144 fileContents, err := ioutil.ReadFile(pathToDropletFile) 145 Expect(err).ToNot(HaveOccurred()) 146 Expect(string(fileContents)).To(Equal("some-droplet")) 147 }) 148 149 It("displays the file it created and returns no errors", func() { 150 Expect(testUI.Out).To(Say("Downloading droplet some-droplet-guid for app some-app in org some-org / space some-space as some-user...")) 151 Expect(testUI.Err).To(Say("some-warning")) 152 Expect(testUI.Out).To(Say(`Droplet downloaded successfully at .*droplet_some-droplet-guid.tgz`)) 153 Expect(testUI.Out).To(Say("OK")) 154 Expect(executeErr).ToNot(HaveOccurred()) 155 }) 156 }) 157 158 When("a path to a file is passed in", func() { 159 BeforeEach(func() { 160 cmd.Path = "some-file.tgz" 161 fakeActor.DownloadCurrentDropletByAppNameReturns([]byte("some-droplet"), "some-droplet-guid", v7action.Warnings{"some-warning"}, nil) 162 }) 163 164 AfterEach(func() { 165 Expect(os.Remove(cmd.Path)).ToNot(HaveOccurred()) 166 }) 167 168 It("creates a droplet tarball at the specified path", func() { 169 Expect(executeErr).ToNot(HaveOccurred()) 170 171 fileContents, err := ioutil.ReadFile(cmd.Path) 172 Expect(err).ToNot(HaveOccurred()) 173 Expect(string(fileContents)).To(Equal("some-droplet")) 174 }) 175 176 It("displays the file it created and returns no errors", func() { 177 Expect(testUI.Out).To(Say("Downloading current droplet for app some-app in org some-org / space some-space as some-user...")) 178 Expect(testUI.Err).To(Say("some-warning")) 179 Expect(testUI.Out).To(Say(`Droplet downloaded successfully at %s`, cmd.Path)) 180 Expect(testUI.Out).To(Say("OK")) 181 Expect(executeErr).ToNot(HaveOccurred()) 182 }) 183 }) 184 185 When("a path to an existing directory is passed in", func() { 186 BeforeEach(func() { 187 tmpDir, err := ioutil.TempDir("", "droplets") 188 Expect(err).NotTo(HaveOccurred()) 189 cmd.Path = tmpDir 190 191 fakeActor.DownloadCurrentDropletByAppNameReturns([]byte("some-droplet"), "some-droplet-guid", v7action.Warnings{"some-warning"}, nil) 192 }) 193 194 AfterEach(func() { 195 Expect(os.RemoveAll(cmd.Path)).ToNot(HaveOccurred()) 196 }) 197 198 It("creates a droplet tarball at the specified path", func() { 199 Expect(executeErr).ToNot(HaveOccurred()) 200 201 fileContents, err := ioutil.ReadFile(filepath.Join(cmd.Path, "droplet_some-droplet-guid.tgz")) 202 Expect(err).ToNot(HaveOccurred()) 203 Expect(string(fileContents)).To(Equal("some-droplet")) 204 }) 205 206 It("displays the file it created and returns no errors", func() { 207 Expect(executeErr).ToNot(HaveOccurred()) 208 Expect(testUI.Out).To(Say("Downloading current droplet for app some-app in org some-org / space some-space as some-user...")) 209 Expect(testUI.Err).To(Say("some-warning")) 210 pathRegExp := regexp.QuoteMeta(filepath.Join(cmd.Path, "droplet_some-droplet-guid.tgz")) 211 Expect(testUI.Out).To(Say(`Droplet downloaded successfully at %s`, pathRegExp)) 212 Expect(testUI.Out).To(Say("OK")) 213 }) 214 }) 215 216 When("a path to a file in an invalid directory is passed in", func() { 217 BeforeEach(func() { 218 cmd.Path = "not/exist/some-file.tgz" 219 fakeActor.DownloadCurrentDropletByAppNameReturns([]byte("some-droplet"), "some-droplet-guid", v7action.Warnings{"some-warning"}, nil) 220 }) 221 222 It("returns an appropriate error", func() { 223 _, ok := executeErr.(translatableerror.DropletFileError) 224 Expect(ok).To(BeTrue()) 225 }) 226 }) 227 228 When("there is an error downloading the droplet", func() { 229 BeforeEach(func() { 230 fakeActor.DownloadCurrentDropletByAppNameReturns([]byte{}, "", v7action.Warnings{"some-warning"}, errors.New("something went wrong")) 231 }) 232 233 It("displays warnings and returns an error", func() { 234 Expect(testUI.Err).To(Say("some-warning")) 235 Expect(executeErr).To(MatchError("something went wrong")) 236 }) 237 }) 238 239 When("the app does not have a current droplet", func() { 240 BeforeEach(func() { 241 fakeActor.DownloadCurrentDropletByAppNameReturns([]byte{}, "", v7action.Warnings{"some-warning"}, actionerror.DropletNotFoundError{}) 242 }) 243 244 It("displays warnings and returns an error", func() { 245 Expect(testUI.Err).To(Say("some-warning")) 246 Expect(executeErr).To(MatchError(translatableerror.NoDropletForAppError{AppName: "some-app"})) 247 }) 248 }) 249 })