github.com/swisscom/cloudfoundry-cli@v7.1.0+incompatible/cf/util/downloader/file_download_test.go (about)

     1  package downloader_test
     2  
     3  import (
     4  	"io/ioutil"
     5  	"net/http"
     6  	"os"
     7  	"path"
     8  
     9  	"code.cloudfoundry.org/cli/cf/util/downloader"
    10  
    11  	"github.com/onsi/gomega/ghttp"
    12  
    13  	. "github.com/onsi/ginkgo"
    14  	. "github.com/onsi/gomega"
    15  )
    16  
    17  var _ = Describe("Downloader", func() {
    18  	var (
    19  		d       downloader.Downloader
    20  		tempDir string
    21  	)
    22  
    23  	BeforeEach(func() {
    24  		var err error
    25  		tempDir, err = ioutil.TempDir("", "file-download-test")
    26  		Expect(err).NotTo(HaveOccurred())
    27  		d = downloader.NewDownloader(tempDir)
    28  	})
    29  
    30  	AfterEach(func() {
    31  		os.RemoveAll(tempDir)
    32  	})
    33  
    34  	Describe("DownloadFile", func() {
    35  		var server *ghttp.Server
    36  
    37  		BeforeEach(func() {
    38  			server = ghttp.NewServer()
    39  		})
    40  
    41  		AfterEach(func() {
    42  			server.Close()
    43  
    44  			err := d.RemoveFile()
    45  			Expect(err).NotTo(HaveOccurred())
    46  		})
    47  
    48  		Context("when the server responds with the file", func() {
    49  			BeforeEach(func() {
    50  				server.AppendHandlers(
    51  					ghttp.CombineHandlers(
    52  						ghttp.VerifyRequest("GET", "/abc.zip"),
    53  						ghttp.RespondWith(http.StatusOK, "abc123"),
    54  					),
    55  				)
    56  			})
    57  
    58  			It("saves file with name found in URL in provided dir", func() {
    59  				_, _, err := d.DownloadFile(server.URL() + "/abc.zip")
    60  				Expect(err).NotTo(HaveOccurred())
    61  
    62  				_, err = os.Stat(path.Join(tempDir, "abc.zip"))
    63  				Expect(err).NotTo(HaveOccurred())
    64  			})
    65  
    66  			It("returns the number of bytes written to the file", func() {
    67  				n, _, err := d.DownloadFile(server.URL() + "/abc.zip")
    68  				Expect(err).NotTo(HaveOccurred())
    69  				Expect(n).To(Equal(int64(len("abc123"))))
    70  			})
    71  
    72  			It("returns the name of the file that was downloaded", func() {
    73  				_, name, err := d.DownloadFile(server.URL() + "/abc.zip")
    74  				Expect(err).NotTo(HaveOccurred())
    75  				Expect(name).To(Equal("abc.zip"))
    76  			})
    77  		})
    78  
    79  		Context("when the server responds with the filename in the header", func() {
    80  			BeforeEach(func() {
    81  				server.AppendHandlers(
    82  					ghttp.CombineHandlers(
    83  						ghttp.VerifyRequest("GET", "/abc.zip"),
    84  						ghttp.RespondWith(http.StatusOK, "abc123", http.Header{
    85  							"Content-Disposition": []string{"attachment; filename=header.zip"},
    86  						}),
    87  					),
    88  				)
    89  			})
    90  
    91  			It("downloads the file named in the header to the provided dir, and trims spaces appropriately", func() {
    92  				_, _, err := d.DownloadFile(server.URL() + "/abc.zip")
    93  				Expect(err).NotTo(HaveOccurred())
    94  
    95  				_, err = os.Stat(path.Join(tempDir, "header.zip"))
    96  				Expect(err).NotTo(HaveOccurred())
    97  
    98  				_, err = os.Stat(path.Join(tempDir, "abc.zip"))
    99  				Expect(err).To(HaveOccurred())
   100  			})
   101  
   102  			It("returns the number of bytes written to the file", func() {
   103  				n, _, err := d.DownloadFile(server.URL() + "/abc.zip")
   104  				Expect(err).NotTo(HaveOccurred())
   105  				Expect(n).To(Equal(int64(len("abc123"))))
   106  			})
   107  
   108  			It("returns the name of the file that was downloaded", func() {
   109  				_, name, err := d.DownloadFile(server.URL() + "/abc.zip")
   110  				Expect(err).NotTo(HaveOccurred())
   111  				Expect(name).To(Equal("header.zip"))
   112  			})
   113  		})
   114  
   115  		Context("when the server returns a redirect to a file", func() {
   116  			BeforeEach(func() {
   117  				server.AppendHandlers(
   118  					ghttp.CombineHandlers(
   119  						ghttp.VerifyRequest("GET", "/abc.zip"),
   120  						ghttp.RespondWith(http.StatusFound, "", http.Header{
   121  							"Location": []string{server.URL() + "/redirect.zip"},
   122  						}),
   123  					),
   124  					ghttp.CombineHandlers(
   125  						ghttp.VerifyRequest("GET", "/redirect.zip"),
   126  						ghttp.RespondWith(http.StatusOK, "abc123"),
   127  					),
   128  				)
   129  			})
   130  
   131  			It("downloads the file from the redirect to the provided dir", func() {
   132  				_, _, err := d.DownloadFile(server.URL() + "/abc.zip")
   133  				Expect(err).NotTo(HaveOccurred())
   134  
   135  				_, err = os.Stat(path.Join(tempDir, "redirect.zip"))
   136  				Expect(err).NotTo(HaveOccurred())
   137  
   138  				_, err = os.Stat(path.Join(tempDir, "abc.zip"))
   139  				Expect(err).To(HaveOccurred())
   140  			})
   141  
   142  			It("returns the number of bytes written to the file", func() {
   143  				n, _, err := d.DownloadFile(server.URL() + "/abc.zip")
   144  				Expect(err).NotTo(HaveOccurred())
   145  				Expect(n).To(Equal(int64(len("abc123"))))
   146  			})
   147  
   148  			It("returns the name of the file that was downloaded", func() {
   149  				_, name, err := d.DownloadFile(server.URL() + "/abc.zip")
   150  				Expect(err).NotTo(HaveOccurred())
   151  				Expect(name).To(Equal("redirect.zip"))
   152  			})
   153  		})
   154  
   155  		Context("when the URL is invalid", func() {
   156  			It("returns an error", func() {
   157  				_, _, err := d.DownloadFile("http://going.nowwhere/abc.zip")
   158  				Expect(err).To(HaveOccurred())
   159  			})
   160  		})
   161  	})
   162  
   163  	Describe("RemoveFile", func() {
   164  		var server *ghttp.Server
   165  
   166  		BeforeEach(func() {
   167  			server = ghttp.NewServer()
   168  			server.AppendHandlers(
   169  				ghttp.CombineHandlers(
   170  					ghttp.VerifyRequest("GET", "/abc.zip"),
   171  					ghttp.RespondWith(http.StatusOK, "abc123"),
   172  				),
   173  			)
   174  		})
   175  
   176  		AfterEach(func() {
   177  			server.Close()
   178  		})
   179  
   180  		Context("when a file has been downloaded", func() {
   181  			BeforeEach(func() {
   182  				_, _, err := d.DownloadFile(server.URL() + "/abc.zip")
   183  				Expect(err).NotTo(HaveOccurred())
   184  			})
   185  
   186  			It("removes the downloaded file", func() {
   187  				_, err := os.Stat(path.Join(tempDir, "abc.zip"))
   188  				Expect(err).NotTo(HaveOccurred())
   189  
   190  				err = d.RemoveFile()
   191  				Expect(err).NotTo(HaveOccurred())
   192  
   193  				_, err = os.Stat(path.Join(tempDir, "abc.zip"))
   194  				Expect(err).To(HaveOccurred())
   195  			})
   196  		})
   197  
   198  		It("does not return an error when a file has not been downloaded", func() {
   199  			err := d.RemoveFile()
   200  			Expect(err).NotTo(HaveOccurred())
   201  		})
   202  	})
   203  })