summaryrefslogtreecommitdiff
path: root/js_lib_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'js_lib_test.go')
-rw-r--r--js_lib_test.go166
1 files changed, 121 insertions, 45 deletions
diff --git a/js_lib_test.go b/js_lib_test.go
index 8d58c33..3682813 100644
--- a/js_lib_test.go
+++ b/js_lib_test.go
@@ -5,24 +5,20 @@
package flyscrape_test
import (
- "fmt"
- "io"
+ "encoding/json"
"net/http"
- "net/http/cookiejar"
- "net/url"
- "strings"
"testing"
"github.com/philippta/flyscrape"
"github.com/stretchr/testify/require"
)
-func TestJSLibFetchDocument(t *testing.T) {
+func TestJSLibParse(t *testing.T) {
script := `
- import { fetchDocument } from "flyscrape"
+ import { parse } from "flyscrape"
- const doc = fetchDocument("https://example.com")
- export const headline = doc.find("h1").text()
+ const doc = parse('<div class=foo>Hello world</div>')
+ export const text = doc.find(".foo").text()
`
client := &http.Client{
@@ -32,60 +28,140 @@ func TestJSLibFetchDocument(t *testing.T) {
exports, err := flyscrape.Compile(script, flyscrape.NewJSLibrary(client))
require.NoError(t, err)
- h, ok := exports["headline"].(string)
+ h, ok := exports["text"].(string)
require.True(t, ok)
- require.Equal(t, "headline", h)
+ require.Equal(t, "Hello world", h)
}
-func TestJSLibSubmitForm(t *testing.T) {
+func TestJSLibHTTPGet(t *testing.T) {
script := `
- import { submitForm } from "flyscrape"
+ import http from "flyscrape/http"
- const doc = submitForm("https://example.com", {
- "username": "foo",
- "password": "bar",
+ const res = http.get("https://example.com")
+
+ export const body = res.body;
+ export const status = res.status;
+ export const error = res.error;
+ export const headers = res.headers;
+ `
+
+ client := &http.Client{
+ Transport: flyscrape.MockTransport(200, html),
+ }
+
+ exports, err := flyscrape.Compile(script, flyscrape.NewJSLibrary(client))
+ require.NoError(t, err)
+
+ body, ok := exports["body"].(string)
+ require.True(t, ok)
+ require.Equal(t, html, body)
+
+ status, ok := exports["status"].(int64)
+ require.True(t, ok)
+ require.Equal(t, int64(200), status)
+
+ error, ok := exports["error"].(string)
+ require.True(t, ok)
+ require.Equal(t, "", error)
+
+ headers, ok := exports["headers"].(map[string]any)
+ require.True(t, ok)
+ require.NotEmpty(t, headers)
+}
+
+func TestJSLibHTTPPostForm(t *testing.T) {
+ script := `
+ import http from "flyscrape/http"
+
+ const res = http.postForm("https://example.com", {
+ username: "foo",
+ password: "bar",
+ arr: [1,2,3],
})
- export const text = doc.find("div").text()
+ export const body = res.body;
+ export const status = res.status;
+ export const error = res.error;
+ export const headers = res.headers;
`
- var username, password string
+ client := &http.Client{
+ Transport: flyscrape.RoundTripFunc(func(r *http.Request) (*http.Response, error) {
+ require.Equal(t, "POST", r.Method)
+ require.Equal(t, "application/x-www-form-urlencoded", r.Header.Get("Content-Type"))
+ require.Equal(t, "foo", r.FormValue("username"))
+ require.Equal(t, "bar", r.FormValue("password"))
+ require.Len(t, r.Form["arr"], 3)
+
+ return flyscrape.MockResponse(400, "Bad Request")
+ }),
+ }
+
+ exports, err := flyscrape.Compile(script, flyscrape.NewJSLibrary(client))
+ require.NoError(t, err)
+
+ body, ok := exports["body"].(string)
+ require.True(t, ok)
+ require.Equal(t, "Bad Request", body)
+
+ status, ok := exports["status"].(int64)
+ require.True(t, ok)
+ require.Equal(t, int64(400), status)
+
+ error, ok := exports["error"].(string)
+ require.True(t, ok)
+ require.Equal(t, "", error)
+
+ headers, ok := exports["headers"].(map[string]any)
+ require.True(t, ok)
+ require.NotEmpty(t, headers)
+}
+
+func TestJSLibHTTPPostJSON(t *testing.T) {
+ script := `
+ import http from "flyscrape/http"
+
+ const res = http.postJSON("https://example.com", {
+ username: "foo",
+ password: "bar",
+ })
+
+ export const body = res.body;
+ export const status = res.status;
+ export const error = res.error;
+ export const headers = res.headers;
+ `
- jar, _ := cookiejar.New(nil)
client := &http.Client{
- Jar: jar,
Transport: flyscrape.RoundTripFunc(func(r *http.Request) (*http.Response, error) {
- username = r.FormValue("username")
- password = r.FormValue("password")
-
- resp := &http.Response{
- StatusCode: 200,
- Status: fmt.Sprintf("%d %s", 200, http.StatusText(200)),
- Body: io.NopCloser(strings.NewReader(`<div>Login successful</div>`)),
- Header: http.Header{},
- }
-
- cookie := http.Cookie{
- Name: "example",
- Value: "Hello world!",
- Path: "/",
- MaxAge: 3600,
- }
-
- resp.Header.Add("Set-Cookie", cookie.String())
- return resp, nil
+ require.Equal(t, "POST", r.Method)
+ require.Equal(t, "application/json", r.Header.Get("Content-Type"))
+
+ m := map[string]any{}
+ json.NewDecoder(r.Body).Decode(&m)
+ require.Equal(t, "foo", m["username"])
+ require.Equal(t, "bar", m["password"])
+
+ return flyscrape.MockResponse(400, "Bad Request")
}),
}
exports, err := flyscrape.Compile(script, flyscrape.NewJSLibrary(client))
require.NoError(t, err)
- text, ok := exports["text"].(string)
+ body, ok := exports["body"].(string)
+ require.True(t, ok)
+ require.Equal(t, "Bad Request", body)
+
+ status, ok := exports["status"].(int64)
require.True(t, ok)
- require.Equal(t, "Login successful", text)
- require.Equal(t, "foo", username)
- require.Equal(t, "bar", password)
+ require.Equal(t, int64(400), status)
- u, _ := url.Parse("https://example.com")
- require.NotEmpty(t, jar.Cookies(u))
+ error, ok := exports["error"].(string)
+ require.True(t, ok)
+ require.Equal(t, "", error)
+
+ headers, ok := exports["headers"].(map[string]any)
+ require.True(t, ok)
+ require.NotEmpty(t, headers)
}