@@ -2,6 +2,7 @@ package rod_test
2
2
3
3
import (
4
4
"context"
5
+ "errors"
5
6
"fmt"
6
7
"io/ioutil"
7
8
"net/http"
@@ -40,8 +41,13 @@ func (s *S) TestHijack() {
40
41
r := ctx .Request
41
42
r .Req ().URL = r .Req ().URL // override request url
42
43
r .Req ().Header .Set ("Test" , "header" ) // override request header
44
+ r .SetBody ([]byte ("test" )) // override request body
45
+ r .SetBody (123 ) // override request body
43
46
r .SetBody (r .Body ()) // override request body
44
47
48
+ s .Equal (http .MethodPost , r .Method ())
49
+ s .Equal (url + "/a" , r .URL ().String ())
50
+
45
51
s .Equal (proto .NetworkResourceTypeXHR , ctx .Request .Type ())
46
52
s .Contains (ctx .Request .Header ("Origin" ), url )
47
53
s .Len (ctx .Request .Headers (), 5 )
@@ -62,9 +68,11 @@ func (s *S) TestHijack() {
62
68
ctx .Response .SetHeader ("Set-Cookie" , "key=val" )
63
69
64
70
// override response body
65
- ctx .Response .SetBody (utils .MustToJSON (map [string ]string {
66
- "text" : ctx .Response .Body (),
67
- }))
71
+ ctx .Response .SetBody ([]byte ("test" ))
72
+ ctx .Response .SetBody (123 )
73
+ ctx .Response .SetBody (map [string ]string {
74
+ "text" : "test" ,
75
+ })
68
76
69
77
s .Equal ("{\" text\" :\" test\" }" , ctx .Response .Body ())
70
78
})
@@ -155,6 +163,78 @@ func (s *S) TestHijackFailRequest() {
155
163
}()
156
164
}
157
165
166
+ func (s * S ) TestHijackLoadResponseErr () {
167
+ ctx , cancel := context .WithCancel (s .browser .GetContext ())
168
+ defer cancel ()
169
+ p := s .page .Context (ctx , cancel )
170
+ router := p .HijackRequests ()
171
+ defer router .MustStop ()
172
+
173
+ wg := & sync.WaitGroup {}
174
+ wg .Add (1 )
175
+
176
+ router .MustAdd ("*" , func (ctx * rod.Hijack ) {
177
+ s .Error (ctx .LoadResponse (& http.Client {
178
+ Transport : & MockRoundTripper {err : errors .New ("err" )},
179
+ }, true ))
180
+
181
+ s .Error (ctx .LoadResponse (& http.Client {
182
+ Transport : & MockRoundTripper {res : & http.Response {
183
+ StatusCode : 200 ,
184
+ Body : ioutil .NopCloser (& MockReader {err : errors .New ("err" )}),
185
+ }},
186
+ }, true ))
187
+
188
+ wg .Done ()
189
+ })
190
+
191
+ go router .Run ()
192
+
193
+ go func () { _ = p .Navigate (srcFile ("./fixtures/click.html" )) }()
194
+
195
+ wg .Wait ()
196
+ }
197
+
198
+ func (s * S ) TestHijackResponseErr () {
199
+ url , mux , close := utils .Serve ("" )
200
+ defer close ()
201
+
202
+ // to simulate a backend server
203
+ mux .HandleFunc ("/" , httpHTML (`ok` ))
204
+
205
+ ctx , cancel := context .WithCancel (s .browser .GetContext ())
206
+ defer cancel ()
207
+ p := s .page .Context (ctx , cancel )
208
+ router := p .HijackRequests ()
209
+ defer router .MustStop ()
210
+
211
+ wg := & sync.WaitGroup {}
212
+ wg .Add (1 )
213
+
214
+ router .MustAdd ("*" , func (ctx * rod.Hijack ) {
215
+ ctx .OnError = func (err error ) {
216
+ s .Error (err )
217
+ wg .Done ()
218
+ }
219
+
220
+ ctx .MustLoadResponse ()
221
+ s .mockClient .setCall (func (ctx context.Context , sessionID , method string , params interface {}) ([]byte , error ) {
222
+ if method == (proto.FetchFulfillRequest {}).MethodName () {
223
+ return nil , errors .New ("err" )
224
+ }
225
+ return s .mockClient .principal .Call (ctx , sessionID , method , params )
226
+ })
227
+
228
+ })
229
+
230
+ go router .Run ()
231
+
232
+ go func () { _ = p .Navigate (url ) }()
233
+
234
+ wg .Wait ()
235
+ s .mockClient .resetCall ()
236
+ }
237
+
158
238
func (s * S ) TestHandleAuth () {
159
239
url , mux , close := utils .Serve ("" )
160
240
defer close ()
@@ -178,6 +258,21 @@ func (s *S) TestHandleAuth() {
178
258
page := s .browser .MustPage (url )
179
259
defer page .MustClose ()
180
260
page .MustElementMatches ("p" , "ok" )
261
+
262
+ func () {
263
+ wait := s .browser .HandleAuth ("a" , "b" )
264
+ go func () { _ , _ = s .browser .Page (url ) }()
265
+
266
+ s .mockClient .setCall (func (ctx context.Context , sessionID , method string , params interface {}) ([]byte , error ) {
267
+ if method == (proto.FetchContinueRequest {}).MethodName () {
268
+ return nil , errors .New ("err" )
269
+ }
270
+ return s .mockClient .principal .Call (ctx , sessionID , method , params )
271
+ })
272
+ defer s .mockClient .resetCall ()
273
+
274
+ s .Error (wait ())
275
+ }()
181
276
}
182
277
183
278
func (s * S ) TestGetDownloadFile () {
@@ -198,6 +293,18 @@ func (s *S) TestGetDownloadFile() {
198
293
data := wait ()
199
294
200
295
s .Equal (content , string (data ))
296
+
297
+ waitErr := page .GetDownloadFile (url + "/d" , "" , & http.Client {
298
+ Transport : & MockRoundTripper {err : errors .New ("err" )},
299
+ })
300
+ page .MustElement ("a" ).MustClick ()
301
+ func () {
302
+ defer s .errorAt (1 , nil )()
303
+ _ , _ , err := waitErr ()
304
+ s .Error (err )
305
+ }()
306
+ _ , _ , err := waitErr ()
307
+ s .Error (err )
201
308
}
202
309
203
310
func (s * S ) TestGetDownloadFileFromDataURI () {
@@ -228,6 +335,13 @@ func (s *S) TestGetDownloadFileFromDataURI() {
228
335
page .MustElement ("#b" ).MustClick ()
229
336
data = wait ()
230
337
s .Equal ("test blob" , string (data ))
338
+
339
+ s .Panics (func () {
340
+ wait = page .MustGetDownloadFile ("data:*" )
341
+ page .MustElement ("#b" ).MustClick ()
342
+ defer s .errorAt (2 , nil )()
343
+ data = wait ()
344
+ })
231
345
}
232
346
233
347
func (s * S ) TestGetDownloadFileWithHijack () {
0 commit comments