From 2d3cd6584dedce45ea709d1757a28ce7537f3472 Mon Sep 17 00:00:00 2001 From: Philipp Tanlak Date: Mon, 30 Oct 2023 19:02:50 +0100 Subject: Refactor to prepare for builtin JS functions --- js_test.go | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 153 insertions(+), 9 deletions(-) (limited to 'js_test.go') 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)) +} -- cgit v1.2.3