diff options
| author | Philipp Tanlak <philipp.tanlak@gmail.com> | 2023-11-15 16:31:50 +0100 |
|---|---|---|
| committer | Philipp Tanlak <philipp.tanlak@gmail.com> | 2023-11-15 23:54:03 +0100 |
| commit | 94da9293f63e46712b0a890e1e0eab4153fdb3f9 (patch) | |
| tree | de81e6d00f7e1a5215d18557e772e7f1131d218b /js_lib_test.go | |
| parent | 3e01902887bdc52e743ef6cec53a5c89cb5637f0 (diff) | |
Add file download functionality
Diffstat (limited to 'js_lib_test.go')
| -rw-r--r-- | js_lib_test.go | 77 |
1 files changed, 73 insertions, 4 deletions
diff --git a/js_lib_test.go b/js_lib_test.go index 3682813..e375308 100644 --- a/js_lib_test.go +++ b/js_lib_test.go @@ -7,6 +7,7 @@ package flyscrape_test import ( "encoding/json" "net/http" + "os" "testing" "github.com/philippta/flyscrape" @@ -25,7 +26,8 @@ func TestJSLibParse(t *testing.T) { Transport: flyscrape.MockTransport(200, html), } - exports, err := flyscrape.Compile(script, flyscrape.NewJSLibrary(client)) + imports, _ := flyscrape.NewJSLibrary(client) + exports, err := flyscrape.Compile(script, imports) require.NoError(t, err) h, ok := exports["text"].(string) @@ -49,7 +51,8 @@ func TestJSLibHTTPGet(t *testing.T) { Transport: flyscrape.MockTransport(200, html), } - exports, err := flyscrape.Compile(script, flyscrape.NewJSLibrary(client)) + imports, _ := flyscrape.NewJSLibrary(client) + exports, err := flyscrape.Compile(script, imports) require.NoError(t, err) body, ok := exports["body"].(string) @@ -97,7 +100,8 @@ func TestJSLibHTTPPostForm(t *testing.T) { }), } - exports, err := flyscrape.Compile(script, flyscrape.NewJSLibrary(client)) + imports, _ := flyscrape.NewJSLibrary(client) + exports, err := flyscrape.Compile(script, imports) require.NoError(t, err) body, ok := exports["body"].(string) @@ -146,7 +150,8 @@ func TestJSLibHTTPPostJSON(t *testing.T) { }), } - exports, err := flyscrape.Compile(script, flyscrape.NewJSLibrary(client)) + imports, _ := flyscrape.NewJSLibrary(client) + exports, err := flyscrape.Compile(script, imports) require.NoError(t, err) body, ok := exports["body"].(string) @@ -165,3 +170,67 @@ func TestJSLibHTTPPostJSON(t *testing.T) { require.True(t, ok) require.NotEmpty(t, headers) } + +func TestJSLibHTTPDownload(t *testing.T) { + cwd, err := os.Getwd() + require.NoError(t, err) + + tmpdir, err := os.MkdirTemp("", "http-download") + require.NoError(t, err) + + defer os.RemoveAll(tmpdir) + defer os.Chdir(cwd) + os.Chdir(tmpdir) + + script := ` + import http from "flyscrape/http"; + + http.download("https://example.com/foo.txt", "foo.txt"); + http.download("https://example.com/foo.txt", "dir/my-foo.txt"); + http.download("https://example.com/bar.txt", "dir/"); + http.download("https://example.com/baz.txt", "dir"); + http.download("https://example.com/content-disposition", "."); + http.download("https://example.com/hack.txt", "."); + http.download("https://example.com/no-dest.txt"); + http.download("https://example.com/404.txt"); + ` + + nreqs := 0 + client := &http.Client{ + Transport: flyscrape.RoundTripFunc(func(r *http.Request) (*http.Response, error) { + nreqs++ + + if r.URL.Path == "/content-disposition" { + resp, err := flyscrape.MockResponse(200, "hello world") + resp.Header.Set("Content-Disposition", `attachment; filename="qux.txt"`) + return resp, err + } + if r.URL.Path == "/hack.txt" { + resp, err := flyscrape.MockResponse(200, "hello world") + resp.Header.Set("Content-Disposition", `attachment; filename="../../hack.txt"`) + return resp, err + } + if r.URL.Path == "/404.txt" { + resp, err := flyscrape.MockResponse(404, "hello world") + return resp, err + } + + return flyscrape.MockResponse(200, "hello world") + }), + } + + imports, wait := flyscrape.NewJSLibrary(client) + _, err = flyscrape.Compile(script, imports) + require.NoError(t, err) + + wait() + + require.Equal(t, nreqs, 8) + require.FileExists(t, "foo.txt") + require.FileExists(t, "dir/my-foo.txt") + require.FileExists(t, "dir/bar.txt") + require.FileExists(t, "qux.txt") + require.FileExists(t, "hack.txt") + require.FileExists(t, "no-dest.txt") + require.NoFileExists(t, "404.txt") +} |