// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package flyscrape_test
import (
"encoding/json"
"net/http"
"testing"
"github.com/philippta/flyscrape"
"github.com/stretchr/testify/require"
)
func TestJSLibParse(t *testing.T) {
script := `
import { parse } from "flyscrape"
const doc = parse('
Hello world
')
export const text = doc.find(".foo").text()
`
client := &http.Client{
Transport: flyscrape.MockTransport(200, html),
}
exports, err := flyscrape.Compile(script, flyscrape.NewJSLibrary(client))
require.NoError(t, err)
h, ok := exports["text"].(string)
require.True(t, ok)
require.Equal(t, "Hello world", h)
}
func TestJSLibHTTPGet(t *testing.T) {
script := `
import http from "flyscrape/http"
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 body = res.body;
export const status = res.status;
export const error = res.error;
export const headers = res.headers;
`
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;
`
client := &http.Client{
Transport: flyscrape.RoundTripFunc(func(r *http.Request) (*http.Response, error) {
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)
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)
}