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