summaryrefslogtreecommitdiff
path: root/js_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'js_test.go')
-rw-r--r--js_test.go162
1 files changed, 153 insertions, 9 deletions
diff --git a/js_test.go b/js_test.go
index 2cf8f25..acefa38 100644
--- a/js_test.go
+++ b/js_test.go
@@ -8,6 +8,7 @@ import (
"encoding/json"
"testing"
+ "github.com/dop251/goja"
"github.com/philippta/flyscrape"
"github.com/stretchr/testify/require"
)
@@ -37,12 +38,12 @@ export default function({ doc, url }) {
`
func TestJSScrape(t *testing.T) {
- cfg, run, err := flyscrape.Compile(script)
+ exports, err := flyscrape.Compile(script, nil)
require.NoError(t, err)
- require.NotNil(t, cfg)
- require.NotNil(t, run)
+ require.NotNil(t, exports)
+ require.NotEmpty(t, exports.Config)
- result, err := run(flyscrape.ScrapeParams{
+ result, err := exports.Scrape(flyscrape.ScrapeParams{
HTML: html,
URL: "http://localhost/",
})
@@ -56,11 +57,89 @@ func TestJSScrape(t *testing.T) {
require.Equal(t, "http://localhost/", m["url"])
}
+func TestJSScrapeObject(t *testing.T) {
+ js := `
+ export default function() {
+ return {foo: "bar"}
+ }
+ `
+ exports, err := flyscrape.Compile(js, nil)
+ require.NoError(t, err)
+
+ result, err := exports.Scrape(flyscrape.ScrapeParams{
+ HTML: html,
+ URL: "http://localhost/",
+ })
+ require.NoError(t, err)
+
+ m, ok := result.(map[string]any)
+ require.True(t, ok)
+ require.Equal(t, "bar", m["foo"])
+}
+
+func TestJSScrapeNull(t *testing.T) {
+ js := `
+ export default function() {
+ return null
+ }
+ `
+ exports, err := flyscrape.Compile(js, nil)
+ require.NoError(t, err)
+
+ result, err := exports.Scrape(flyscrape.ScrapeParams{
+ HTML: html,
+ URL: "http://localhost/",
+ })
+ require.NoError(t, err)
+ require.Nil(t, result)
+}
+
+func TestJSScrapeString(t *testing.T) {
+ js := `
+ export default function() {
+ return "foo"
+ }
+ `
+ exports, err := flyscrape.Compile(js, nil)
+ require.NoError(t, err)
+
+ result, err := exports.Scrape(flyscrape.ScrapeParams{
+ HTML: html,
+ URL: "http://localhost/",
+ })
+ require.NoError(t, err)
+
+ m, ok := result.(string)
+ require.True(t, ok)
+ require.Equal(t, "foo", m)
+}
+
+func TestJSScrapeArray(t *testing.T) {
+ js := `
+ export default function() {
+ return [1,2,3]
+ }
+ `
+ exports, err := flyscrape.Compile(js, nil)
+ require.NoError(t, err)
+
+ result, err := exports.Scrape(flyscrape.ScrapeParams{
+ HTML: html,
+ URL: "http://localhost/",
+ })
+ require.NoError(t, err)
+
+ m, ok := result.([]any)
+ require.True(t, ok)
+ require.Equal(t, int64(1), m[0])
+ require.Equal(t, int64(2), m[1])
+ require.Equal(t, int64(3), m[2])
+}
+
func TestJSCompileError(t *testing.T) {
- cfg, run, err := flyscrape.Compile("import foo;")
+ exports, err := flyscrape.Compile("import foo;", nil)
require.Error(t, err)
- require.Empty(t, cfg)
- require.Nil(t, run)
+ require.Nil(t, exports)
var terr flyscrape.TransformError
require.ErrorAs(t, err, &terr)
@@ -81,8 +160,10 @@ func TestJSConfig(t *testing.T) {
}
export default function() {}
`
- rawCfg, _, err := flyscrape.Compile(js)
+ exports, err := flyscrape.Compile(js, nil)
require.NoError(t, err)
+ require.NotNil(t, exports)
+ require.NotEmpty(t, exports.Config())
type config struct {
URL string `json:"url"`
@@ -91,7 +172,7 @@ func TestJSConfig(t *testing.T) {
}
var cfg config
- err = json.Unmarshal(rawCfg, &cfg)
+ err = json.Unmarshal(exports.Config(), &cfg)
require.NoError(t, err)
require.Equal(t, config{
@@ -100,3 +181,66 @@ func TestJSConfig(t *testing.T) {
AllowedDomains: []string{"example.com"},
}, cfg)
}
+
+func TestJSImports(t *testing.T) {
+ js := `
+ import A from "pkg-a"
+ import { bar } from "pkg-a/pkg-b"
+
+ export const config = {}
+ export default function() {}
+
+ export const a = A.foo
+ export const b = bar()
+ `
+ imports := flyscrape.Imports{
+ "pkg-a": map[string]any{
+ "foo": 10,
+ },
+ "pkg-a/pkg-b": map[string]any{
+ "bar": func() string {
+ return "baz"
+ },
+ },
+ }
+
+ exports, err := flyscrape.Compile(js, imports)
+ require.NoError(t, err)
+ require.NotNil(t, exports)
+
+ require.Equal(t, int64(10), exports["a"].(int64))
+ require.Equal(t, "baz", exports["b"].(string))
+}
+
+func TestJSArbitraryFunction(t *testing.T) {
+ js := `
+ export const config = {}
+ export default function() {}
+ export function foo() {
+ return "bar";
+ }
+ `
+ exports, err := flyscrape.Compile(js, nil)
+ require.NoError(t, err)
+ require.NotNil(t, exports)
+
+ foo := func() string {
+ fn := exports["foo"].(func(goja.FunctionCall) goja.Value)
+ return fn(goja.FunctionCall{}).String()
+ }
+
+ require.Equal(t, "bar", foo())
+}
+
+func TestJSArbitraryConstString(t *testing.T) {
+ js := `
+ export const config = {}
+ export default function() {}
+ export const foo = "bar"
+ `
+ exports, err := flyscrape.Compile(js, nil)
+ require.NoError(t, err)
+ require.NotNil(t, exports)
+
+ require.Equal(t, "bar", exports["foo"].(string))
+}