package playwright_test import ( "fmt" "log" "net/http" "path/filepath" "strings" "testing" "github.com/stretchr/testify/require" ) func TestDownloadBasic(t *testing.T) { BeforeEach(t) defer AfterEach(t) server.SetRoute("/downloadWithFilename", func(w http.ResponseWriter, r *http.Request) { w.Header().Add("Content-Type", "application/octet-stream") w.Header().Add("Content-Disposition", "attachment; filename=file.txt") if _, err := w.Write([]byte("foobar")); err != nil { log.Printf("could not write: %v", err) } }) require.NoError(t, page.SetContent( fmt.Sprintf(`download`, server.PREFIX), )) download, err := page.ExpectDownload(func() error { return page.Click("a") }) require.NoError(t, err) require.Equal(t, download.URL(), fmt.Sprintf("%s/downloadWithFilename", server.PREFIX)) require.Equal(t, download.SuggestedFilename(), "file.txt") require.Equal(t, download.String(), "file.txt") failure, err := download.Failure() require.NoError(t, err) require.Equal(t, failure, "") file, err := download.Path() require.NoError(t, err) require.FileExists(t, file) tmpFile := filepath.Join(t.TempDir(), download.SuggestedFilename()) require.NoFileExists(t, tmpFile) require.NoError(t, download.SaveAs(tmpFile)) require.FileExists(t, tmpFile) require.NoError(t, download.Delete()) require.NoFileExists(t, file) } func TestDownloadCancel(t *testing.T) { BeforeEach(t) defer AfterEach(t) server.SetRoute("/downloadWithDelay", func(w http.ResponseWriter, r *http.Request) { w.Header().Add("Content-Type", "application/octet-stream") w.Header().Add("Content-Disposition", "attachment") if _, err := w.Write([]byte(strings.Repeat("foobar", 8192))); err != nil { log.Printf("could not write: %v", err) } if h, ok := w.(http.Hijacker); ok { if _, _, err := h.Hijack(); err != nil { log.Printf("could not hijack connection: %v", err) } } }) require.NoError(t, page.SetContent( fmt.Sprintf(`download`, server.PREFIX), )) download, err := page.ExpectDownload(func() error { return page.Click("a") }) require.NoError(t, err) require.NoError(t, download.Cancel()) failure, err := download.Failure() require.NoError(t, err) require.Equal(t, "canceled", failure) }