github.com/asifdxtreme/cli@v6.1.3-0.20150123051144-9ead8700b4ae+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 })