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