summaryrefslogblamecommitdiff
path: root/js_lib_test.go
blob: 8d58c336dbdd5dae3f54b947ed31d86d6a85ced7 (plain) (tree)


























































































                                                                                                           
// 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 (
	"fmt"
	"io"
	"net/http"
	"net/http/cookiejar"
	"net/url"
	"strings"
	"testing"

	"github.com/philippta/flyscrape"
	"github.com/stretchr/testify/require"
)

func TestJSLibFetchDocument(t *testing.T) {
	script := `
    import { fetchDocument } from "flyscrape"

    const doc = fetchDocument("https://example.com")
    export const headline = doc.find("h1").text()
    `

	client := &http.Client{
		Transport: flyscrape.MockTransport(200, html),
	}

	exports, err := flyscrape.Compile(script, flyscrape.NewJSLibrary(client))
	require.NoError(t, err)

	h, ok := exports["headline"].(string)
	require.True(t, ok)
	require.Equal(t, "headline", h)
}

func TestJSLibSubmitForm(t *testing.T) {
	script := `
    import { submitForm } from "flyscrape"

    const doc = submitForm("https://example.com", {
        "username": "foo",
        "password": "bar",
    })

    export const text = doc.find("div").text()
    `

	var username, password string

	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
		}),
	}

	exports, err := flyscrape.Compile(script, flyscrape.NewJSLibrary(client))
	require.NoError(t, err)

	text, ok := exports["text"].(string)
	require.True(t, ok)
	require.Equal(t, "Login successful", text)
	require.Equal(t, "foo", username)
	require.Equal(t, "bar", password)

	u, _ := url.Parse("https://example.com")
	require.NotEmpty(t, jar.Cookies(u))
}