...

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

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

     1  package playwright_test
     2  
     3  import (
     4  	"net/http"
     5  	"net/url"
     6  	"runtime"
     7  	"sort"
     8  	"strconv"
     9  	"strings"
    10  	"testing"
    11  
    12  	"github.com/playwright-community/playwright-go"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestRequestFulfill(t *testing.T) {
    17  	BeforeEach(t)
    18  	defer AfterEach(t)
    19  	requests := make(chan playwright.Request, 1)
    20  	routes := make(chan playwright.Route, 1)
    21  	err := page.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
    22  		requests <- request
    23  		routes <- route
    24  		err := route.Fulfill(playwright.RouteFulfillOptions{
    25  			Body: "Hello World",
    26  		})
    27  		require.NoError(t, err)
    28  	})
    29  	require.NoError(t, err)
    30  	response, err := page.Goto(server.EMPTY_PAGE)
    31  	response.Finished()
    32  	require.NoError(t, err)
    33  	require.True(t, response.Ok())
    34  	text, err := response.Text()
    35  	require.NoError(t, err)
    36  	require.Equal(t, "Hello World", text)
    37  	request := <-requests
    38  	route := <-routes
    39  	headers, err := route.Request().AllHeaders()
    40  	require.NoError(t, err)
    41  	require.Contains(t, headers, "accept")
    42  	require.Equal(t, route.Request(), request)
    43  	require.Contains(t, request.URL(), "empty.html")
    44  	require.Equal(t, "GET", request.Method())
    45  	require.Contains(t, headers, "user-agent")
    46  	postData, err := request.PostData()
    47  	require.NoError(t, err)
    48  	require.Equal(t, "", postData)
    49  	require.True(t, request.IsNavigationRequest())
    50  	require.Equal(t, request.ResourceType(), "document")
    51  	require.Equal(t, request.Frame(), page.MainFrame())
    52  }
    53  
    54  func TestRequestContinue(t *testing.T) {
    55  	BeforeEach(t)
    56  	defer AfterEach(t)
    57  	intercepted := make(chan bool, 1)
    58  	err := page.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
    59  		intercepted <- true
    60  		err := route.Continue()
    61  		require.NoError(t, err)
    62  	})
    63  	require.NoError(t, err)
    64  	response, err := page.Goto(server.EMPTY_PAGE)
    65  	response.Finished()
    66  	require.NoError(t, err)
    67  	require.True(t, response.Ok())
    68  	require.True(t, <-intercepted)
    69  }
    70  
    71  func TestRequestShouldFireForNavigationRequests(t *testing.T) {
    72  	BeforeEach(t)
    73  	defer AfterEach(t)
    74  	requests := make(chan playwright.Request, 1)
    75  	page.On("request", func(request playwright.Request) {
    76  		requests <- request
    77  	})
    78  	response, err := page.Goto(server.EMPTY_PAGE)
    79  	require.NoError(t, err)
    80  	response.Finished()
    81  	require.True(t, response.Ok())
    82  	<-requests
    83  }
    84  
    85  func TestShouldReportRequestHeadersArray(t *testing.T) {
    86  	BeforeEach(t)
    87  	defer AfterEach(t)
    88  	_, err := page.Goto(server.EMPTY_PAGE)
    89  	require.NoError(t, err)
    90  	request, err := page.ExpectRequest("*/**", func() error {
    91  		_, err := page.Evaluate(`
    92  		() => fetch('/headers', {
    93              headers: [
    94                  ['header-a', 'value-a'],
    95                  ['header-a', 'value-a-1'],
    96                  ['header-a', 'value-a-2'],
    97                  ['header-b', 'value-b'],
    98              ]
    99              })
   100  		`)
   101  		return err
   102  	})
   103  	require.NoError(t, err)
   104  	headers, err := request.AllHeaders()
   105  	require.NoError(t, err)
   106  	require.Contains(t, headers, "header-a")
   107  	valueA, err := request.HeaderValue("header-a")
   108  	require.NoError(t, err)
   109  	require.Equal(t, "value-a, value-a-1, value-a-2", valueA)
   110  	valueA, err = request.HeaderValue("not-there")
   111  	require.NoError(t, err)
   112  	require.Equal(t, "", valueA)
   113  }
   114  
   115  func TestShouldReportResponseHeadersArray(t *testing.T) {
   116  	if isWebKit && runtime.GOOS == "windows" {
   117  		t.Skip("libcurl does not support non-set-cookie multivalue headers")
   118  	}
   119  	BeforeEach(t)
   120  	defer AfterEach(t)
   121  	server.SetRoute("/headers", func(rw http.ResponseWriter, r *http.Request) {
   122  		rw.Header().Add("header-a", "value-a")
   123  		rw.Header().Add("header-a", "value-a-1")
   124  		rw.Header().Add("header-a", "value-a-2")
   125  		rw.Header().Add("header-b", "value-b")
   126  		rw.Header().Add("set-cookie", "a=b")
   127  		rw.Header().Add("set-cookie", "c=d")
   128  	})
   129  	_, err := page.Goto(server.EMPTY_PAGE)
   130  	require.NoError(t, err)
   131  	response, err := page.ExpectResponse("*/**", func() error {
   132  		_, err := page.Evaluate(`
   133  		() => fetch('/headers')
   134  		`)
   135  		return err
   136  	})
   137  	require.NoError(t, err)
   138  	actual_headers := make(map[string][]string)
   139  	pw_headers, err := response.HeadersArray()
   140  	require.NoError(t, err)
   141  	for _, header := range pw_headers {
   142  		if _, ok := actual_headers[strings.ToLower(header.Name)]; !ok {
   143  			actual_headers[strings.ToLower(header.Name)] = make([]string, 0)
   144  		}
   145  		actual_headers[strings.ToLower(header.Name)] = append(actual_headers[strings.ToLower(header.Name)], header.Value)
   146  	}
   147  	for _, k := range []string{"Keep-Alive", "Connection", "Date", "Transfer-Encoding"} {
   148  		delete(actual_headers, strings.ToLower(k))
   149  	}
   150  	require.Equal(t, actual_headers, map[string][]string{
   151  		"header-a":       {"value-a", "value-a-1", "value-a-2"},
   152  		"header-b":       {"value-b"},
   153  		"set-cookie":     {"a=b", "c=d"},
   154  		"content-length": {"0"},
   155  	})
   156  	header, err := response.HeaderValue("header-b")
   157  	require.NoError(t, err)
   158  	require.Equal(t, "value-b", header)
   159  	header, err = response.HeaderValue("set-cookie")
   160  	require.NoError(t, err)
   161  	require.Equal(t, "a=b\nc=d", header)
   162  	header, err = response.HeaderValue("not-there")
   163  	require.NoError(t, err)
   164  	require.Equal(t, "", header)
   165  	headers, err := response.HeaderValues("header-a")
   166  	require.NoError(t, err)
   167  	sort.Strings(headers)
   168  	require.Equal(t, []string{"value-a", "value-a-1", "value-a-2"}, headers)
   169  	headers, err = response.HeaderValues("header-b")
   170  	require.NoError(t, err)
   171  	sort.Strings(headers)
   172  	require.Equal(t, []string{"value-b"}, headers)
   173  	headers, err = response.HeaderValues("set-cookie")
   174  	require.NoError(t, err)
   175  	sort.Strings(headers)
   176  	require.Equal(t, []string{"a=b", "c=d"}, headers)
   177  	headers, err = response.HeaderValues("not-there")
   178  	require.NoError(t, err)
   179  	require.Equal(t, []string{}, headers)
   180  }
   181  
   182  func TestShouldReportResponseServerAddr(t *testing.T) {
   183  	BeforeEach(t)
   184  	defer AfterEach(t)
   185  	response, err := page.Goto(server.EMPTY_PAGE)
   186  	require.NoError(t, err)
   187  	server_addr, err := response.ServerAddr()
   188  	require.NoError(t, err)
   189  	require.NotNil(t, server_addr)
   190  	url, err := url.Parse(server.PREFIX)
   191  	require.NoError(t, err)
   192  	require.Equal(t, url.Port(), strconv.Itoa(server_addr.Port))
   193  }
   194  

View as plain text