github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/fileutils/file_download_test.go (about)

     1  package fileutils_test
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"os"
     8  	"strings"
     9  
    10  	. "github.com/cloudfoundry/cli/fileutils"
    11  
    12  	. "github.com/onsi/ginkgo"
    13  	. "github.com/onsi/gomega"
    14  )
    15  
    16  var _ = Describe("Downloader", func() {
    17  	var (
    18  		ts         *httptest.Server
    19  		downloader Downloader
    20  	)
    21  
    22  	Describe("DownloadFile", func() {
    23  		Context("URL contains filename", func() {
    24  			BeforeEach(func() {
    25  				ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    26  					fmt.Fprintln(w, "abc123")
    27  				}))
    28  				downloader = NewDownloader("./")
    29  			})
    30  
    31  			AfterEach(func() {
    32  				ts.Close()
    33  
    34  				err := downloader.RemoveFile()
    35  				Ω(err).ToNot(HaveOccurred())
    36  			})
    37  
    38  			It("saves file with name found in URL in provided dir", func() {
    39  				_, name, err := downloader.DownloadFile(ts.URL + "/abc.zip")
    40  				Ω(err).ToNot(HaveOccurred())
    41  				Ω(name).To(Equal("abc.zip"))
    42  
    43  				_, err = os.Stat("./abc.zip")
    44  				Ω(err).ToNot(HaveOccurred())
    45  			})
    46  
    47  			It("returns the number of bytes written to the file", func() {
    48  				n, _, err := downloader.DownloadFile(ts.URL + "/abc.zip")
    49  				Ω(err).ToNot(HaveOccurred())
    50  				Ω(n).To(Equal(int64(len("abc123") + 1)))
    51  			})
    52  		})
    53  
    54  		Context("header contains filename", func() {
    55  			BeforeEach(func() {
    56  				ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    57  					w.Header().Set("Content-Disposition", "attachment;filename=header.zip")
    58  					fmt.Fprintln(w, "abc123")
    59  				}))
    60  
    61  				downloader = NewDownloader("./")
    62  			})
    63  
    64  			AfterEach(func() {
    65  				ts.Close()
    66  
    67  				err := downloader.RemoveFile()
    68  				Ω(err).ToNot(HaveOccurred())
    69  			})
    70  
    71  			It("saves file with name found in header, ignore filename in url", func() {
    72  				_, name, err := downloader.DownloadFile(ts.URL + "/abc.zip")
    73  				Ω(err).ToNot(HaveOccurred())
    74  				Ω(name).To(Equal("header.zip"))
    75  
    76  				_, err = os.Stat("./abc.zip")
    77  				Ω(err).To(HaveOccurred())
    78  
    79  				_, err = os.Stat("./header.zip")
    80  				Ω(err).ToNot(HaveOccurred())
    81  			})
    82  
    83  		})
    84  
    85  		Context("When URL redirects", func() {
    86  			BeforeEach(func() {
    87  				ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    88  
    89  					if !strings.Contains(r.URL.String(), "redirect.zip") {
    90  						http.Redirect(w, r, ts.URL+"/redirect.zip", http.StatusMovedPermanently)
    91  					} else {
    92  						fmt.Fprintln(w, "abc123")
    93  					}
    94  				}))
    95  
    96  				downloader = NewDownloader("./")
    97  			})
    98  
    99  			AfterEach(func() {
   100  				ts.Close()
   101  
   102  				err := downloader.RemoveFile()
   103  				Ω(err).ToNot(HaveOccurred())
   104  			})
   105  
   106  			It("follows redirects and download file", func() {
   107  				downloader = NewDownloader("./")
   108  
   109  				_, _, err := downloader.DownloadFile(ts.URL)
   110  				Ω(err).ToNot(HaveOccurred())
   111  
   112  				_, err = os.Stat("./redirect.zip")
   113  				Ω(err).ToNot(HaveOccurred())
   114  			})
   115  
   116  		})
   117  
   118  		Context("When URL is invalid", func() {
   119  			It("returns an error message", func() {
   120  				downloader = NewDownloader("./")
   121  
   122  				_, name, err := downloader.DownloadFile("http://going.nowwhere/abc.zip")
   123  
   124  				Ω(err).To(HaveOccurred())
   125  				Ω(name).To(Equal(""))
   126  			})
   127  		})
   128  
   129  	})
   130  
   131  	Describe("RemoveFile", func() {
   132  		BeforeEach(func() {
   133  			ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   134  				fmt.Fprintln(w, "abc123")
   135  			}))
   136  		})
   137  
   138  		AfterEach(func() {
   139  			ts.Close()
   140  		})
   141  
   142  		It("removes the downloaded file", func() {
   143  			_, _, err := downloader.DownloadFile(ts.URL + "/abc.zip")
   144  			Ω(err).ToNot(HaveOccurred())
   145  
   146  			_, err = os.Stat("./abc.zip")
   147  			Ω(err).ToNot(HaveOccurred())
   148  
   149  			err = downloader.RemoveFile()
   150  			Ω(err).ToNot(HaveOccurred())
   151  
   152  			_, err = os.Stat("./abc.zip")
   153  			Ω(err).To(HaveOccurred())
   154  		})
   155  	})
   156  
   157  })