...

Source file src/github.com/playwright-community/playwright-go/tests/route_test.go

Documentation: github.com/playwright-community/playwright-go/tests

     1  package playwright_test
     2  
     3  import (
     4  	"encoding/json"
     5  	"io/ioutil"
     6  	"net/http"
     7  	"testing"
     8  
     9  	"github.com/playwright-community/playwright-go"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestPageRouteContinue(t *testing.T) {
    14  	BeforeEach(t)
    15  	defer AfterEach(t)
    16  	require.NoError(t, page.SetExtraHTTPHeaders(map[string]string{
    17  		"extra-http": "42",
    18  	}))
    19  	intercepted := make(chan bool, 1)
    20  	err := page.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
    21  		require.Equal(t, route.Request(), request)
    22  		require.Contains(t, request.URL(), "empty.html")
    23  		require.True(t, len(request.Headers()["user-agent"]) > 5)
    24  		require.Equal(t, "42", request.Headers()["extra-http"])
    25  		require.Equal(t, "GET", request.Method())
    26  
    27  		postData, err := request.PostData()
    28  		require.NoError(t, err)
    29  		require.Equal(t, "", postData)
    30  		require.True(t, request.IsNavigationRequest())
    31  		require.Equal(t, "document", request.ResourceType())
    32  		require.Equal(t, request.Frame(), page.MainFrame())
    33  		require.Equal(t, "about:blank", request.Frame().URL())
    34  		require.NoError(t, route.Continue())
    35  		intercepted <- true
    36  	})
    37  	require.NoError(t, err)
    38  	response, err := page.Goto(server.EMPTY_PAGE)
    39  	require.NoError(t, err)
    40  	require.True(t, response.Ok())
    41  	<-intercepted
    42  }
    43  
    44  func TestRouteContinueOverwrite(t *testing.T) {
    45  	BeforeEach(t)
    46  	defer AfterEach(t)
    47  	serverRequestChan := server.WaitForRequestChan("/sleep.zzz")
    48  	_, err := page.Goto(server.EMPTY_PAGE)
    49  	require.NoError(t, err)
    50  	require.NoError(t, page.Route("**/*", func(route playwright.Route, request playwright.Request) {
    51  		headers := request.Headers()
    52  		headers["Foo"] = "bar"
    53  		require.NoError(t, route.Continue(playwright.RouteContinueOptions{
    54  			Method:   playwright.String("POST"),
    55  			Headers:  headers,
    56  			PostData: "foobar",
    57  		}))
    58  	}))
    59  	_, err = page.Evaluate(`() => fetch("/sleep.zzz")`)
    60  	require.NoError(t, err)
    61  	serverRequest := <-serverRequestChan
    62  	require.Equal(t, "POST", serverRequest.Method)
    63  	require.Equal(t, "bar", serverRequest.Header.Get("Foo"))
    64  	respData, err := ioutil.ReadAll(serverRequest.Body)
    65  	require.NoError(t, err)
    66  	require.Equal(t, "foobar", string(respData))
    67  }
    68  
    69  func TestRouteContinueOverwriteBodyBytes(t *testing.T) {
    70  	BeforeEach(t)
    71  	defer AfterEach(t)
    72  	serverRequestChan := server.WaitForRequestChan("/sleep.zzz")
    73  	_, err := page.Goto(server.EMPTY_PAGE)
    74  	require.NoError(t, err)
    75  	require.NoError(t, page.Route("**/*", func(route playwright.Route, request playwright.Request) {
    76  		require.NoError(t, route.Continue(playwright.RouteContinueOptions{
    77  			Method:   playwright.String("POST"),
    78  			PostData: []byte("foobar"),
    79  		}))
    80  	}))
    81  	_, err = page.Evaluate(`() => fetch("/sleep.zzz")`)
    82  	require.NoError(t, err)
    83  	serverRequest := <-serverRequestChan
    84  	require.Equal(t, "POST", serverRequest.Method)
    85  	respData, err := ioutil.ReadAll(serverRequest.Body)
    86  	require.NoError(t, err)
    87  	require.Equal(t, "foobar", string(respData))
    88  }
    89  
    90  func TestRouteFulfill(t *testing.T) {
    91  	BeforeEach(t)
    92  	defer AfterEach(t)
    93  	requestsChan := make(chan playwright.Request, 1)
    94  	err := page.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
    95  		require.Equal(t, route.Request(), request)
    96  		require.Contains(t, request.URL(), "empty.html")
    97  		require.True(t, len(request.Headers()["user-agent"]) > 5)
    98  		require.Equal(t, "GET", request.Method())
    99  
   100  		postData, err := request.PostData()
   101  		require.NoError(t, err)
   102  		require.Equal(t, "", postData)
   103  		require.True(t, request.IsNavigationRequest())
   104  		require.Equal(t, "document", request.ResourceType())
   105  		require.Equal(t, page, page.MainFrame().Page())
   106  		require.Equal(t, request.Frame(), page.MainFrame())
   107  		require.Equal(t, "about:blank", request.Frame().URL())
   108  		require.NoError(t, route.Fulfill(playwright.RouteFulfillOptions{
   109  			Body:        "123",
   110  			ContentType: playwright.String("text/plain"),
   111  			Headers: map[string]string{
   112  				"Foo": "bar",
   113  			},
   114  		}))
   115  		requestsChan <- request
   116  	})
   117  	require.NoError(t, err)
   118  	response, err := page.Goto(server.EMPTY_PAGE)
   119  	require.NoError(t, err)
   120  	require.True(t, response.Ok())
   121  	request := <-requestsChan
   122  	require.Equal(t, request, response.Request())
   123  	text, err := response.Text()
   124  	require.NoError(t, err)
   125  	require.Equal(t, "123", text)
   126  	require.Equal(t, "bar", response.Headers()["foo"])
   127  	require.Equal(t, "text/plain", response.Headers()["content-type"])
   128  }
   129  
   130  func TestRouteFulfillByteSlice(t *testing.T) {
   131  	BeforeEach(t)
   132  	defer AfterEach(t)
   133  	intercepted := make(chan bool, 1)
   134  	err := page.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
   135  		require.NoError(t, route.Fulfill(playwright.RouteFulfillOptions{
   136  			Body:        []byte("123"),
   137  			ContentType: playwright.String("text/plain"),
   138  		}))
   139  		intercepted <- true
   140  	})
   141  	require.NoError(t, err)
   142  	response, err := page.Goto(server.EMPTY_PAGE)
   143  	require.NoError(t, err)
   144  	require.True(t, response.Ok())
   145  	<-intercepted
   146  	text, err := response.Text()
   147  	require.NoError(t, err)
   148  	require.Equal(t, "123", text)
   149  	require.Equal(t, "3", response.Headers()["content-length"])
   150  	require.Equal(t, "text/plain", response.Headers()["content-type"])
   151  }
   152  
   153  func TestRouteFulfillPath(t *testing.T) {
   154  	BeforeEach(t)
   155  	defer AfterEach(t)
   156  	intercepted := make(chan bool, 1)
   157  	err := page.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
   158  		require.NoError(t, route.Fulfill(playwright.RouteFulfillOptions{
   159  			Path: playwright.String(Asset("pptr.png")),
   160  		}))
   161  		intercepted <- true
   162  	})
   163  	require.NoError(t, err)
   164  	response, err := page.Goto(server.EMPTY_PAGE)
   165  	require.NoError(t, err)
   166  	require.True(t, response.Ok())
   167  	<-intercepted
   168  	body, err := response.Body()
   169  	require.NoError(t, err)
   170  	require.True(t, len(body) > 5000)
   171  	require.Equal(t, "image/png", response.Headers()["content-type"])
   172  }
   173  
   174  func TestRequestFinished(t *testing.T) {
   175  	BeforeEach(t)
   176  	defer AfterEach(t)
   177  	eventsStorage := newSyncSlice()
   178  	var request playwright.Request
   179  	page.Once("request", func(r playwright.Request) {
   180  		request = r
   181  		eventsStorage.Append("request")
   182  	})
   183  	page.Once("response", func() {
   184  		eventsStorage.Append("response")
   185  	})
   186  	response, err := page.Goto(server.EMPTY_PAGE)
   187  	require.NoError(t, err)
   188  	response.Finished()
   189  	eventsStorage.Append("requestfinished")
   190  	require.Equal(t, []interface{}{"request", "response", "requestfinished"}, eventsStorage.Get())
   191  	require.Equal(t, response.Request(), request)
   192  	require.Equal(t, response.Frame(), page.MainFrame())
   193  }
   194  
   195  func TestResponsePostData(t *testing.T) {
   196  	BeforeEach(t)
   197  	defer AfterEach(t)
   198  	requestData := map[string]interface{}{
   199  		"foo": "bar123",
   200  		"kek": true,
   201  	}
   202  	server.SetRoute("/foobar", func(w http.ResponseWriter, r *http.Request) {
   203  		require.NoError(t, json.NewEncoder(w).Encode(requestData))
   204  	})
   205  	response, err := page.Goto(server.PREFIX + "/foobar")
   206  	require.NoError(t, err)
   207  	var actualResponse map[string]interface{}
   208  	require.NoError(t, response.JSON(&actualResponse))
   209  	require.Equal(t, requestData, actualResponse)
   210  }
   211  
   212  func TestRouteAbort(t *testing.T) {
   213  	BeforeEach(t)
   214  	defer AfterEach(t)
   215  	failedRequests := make(chan playwright.Request, 1)
   216  	page.Once("requestfailed", func(request playwright.Request) {
   217  		failedRequests <- request
   218  	})
   219  	err := page.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
   220  		require.NoError(t, route.Abort("aborted"))
   221  	})
   222  	require.NoError(t, err)
   223  	_, err = page.Goto(server.EMPTY_PAGE)
   224  	require.Error(t, err)
   225  	request := <-failedRequests
   226  	require.True(t, len(request.Failure().ErrorText) > 5)
   227  }
   228  
   229  func TestRequestPostData(t *testing.T) {
   230  	BeforeEach(t)
   231  	defer AfterEach(t)
   232  	server.SetRoute("/foobar", func(w http.ResponseWriter, r *http.Request) {
   233  		w.WriteHeader(200)
   234  	})
   235  	_, err := page.Goto(server.EMPTY_PAGE)
   236  	require.NoError(t, err)
   237  	require.NoError(t, page.Route("**/foobar", func(route playwright.Route, request playwright.Request) {
   238  		var postData map[string]interface{}
   239  		require.NoError(t, request.PostDataJSON(&postData))
   240  		require.Equal(t, map[string]interface{}{
   241  			"foo": true,
   242  			"kek": float64(123),
   243  		}, postData)
   244  		raw, err := request.PostDataBuffer()
   245  		require.NoError(t, err)
   246  		require.Equal(t, []byte(`{"foo":true,"kek":123}`), raw)
   247  		require.NoError(t, route.Continue())
   248  	}))
   249  	_, err = page.Evaluate(`url => fetch(url, {
   250  		method: 'POST',
   251  		headers: {
   252  			'Content-Type': 'application/json',
   253  		},
   254  		body: JSON.stringify({
   255  			"foo": true,
   256  			"kek": 123,
   257  		})
   258  	})`, server.PREFIX+"/foobar")
   259  	require.NoError(t, err)
   260  }
   261  

View as plain text