From 1623bef26452f5f90c899ca159f237e074c765b0 Mon Sep 17 00:00:00 2001 From: Andrey Lushnikov Date: Tue, 5 Mar 2019 14:57:15 -0800 Subject: [PATCH] test: improve test coverage for Request.continue (#4096) Drive-by: add clarification to docs/api.md regarding chaning "URL". References #4030 --- docs/api.md | 2 +- test/network.spec.js | 74 +++++++++++++++++++++++++++++++-------- utils/testserver/index.js | 5 +++ 3 files changed, 66 insertions(+), 15 deletions(-) diff --git a/docs/api.md b/docs/api.md index d25de37a449..4598e16caea 100644 --- a/docs/api.md +++ b/docs/api.md @@ -3214,7 +3214,7 @@ Exception is immediately thrown if the request interception is not enabled. #### request.continue([overrides]) - `overrides` <[Object]> Optional request overwrites, which can be one of the following: - - `url` <[string]> If set, the request url will be changed + - `url` <[string]> If set, the request url will be changed. This is not a redirect. The request will be silently forwarded to the new url. For example, the address bar will show the original url. - `method` <[string]> If set changes the request method (e.g. `GET` or `POST`) - `postData` <[string]> If set changes the post data of request - `headers` <[Object]> If set changes the request HTTP headers diff --git a/test/network.spec.js b/test/network.spec.js index 98bb7ac77a9..180e6fa64a6 100644 --- a/test/network.spec.js +++ b/test/network.spec.js @@ -513,20 +513,6 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { ]); expect(request.headers['referer']).toBe('http://google.com/'); }); - it_fails_ffox('should amend HTTP headers', async({page, server}) => { - await page.setRequestInterception(true); - page.on('request', request => { - const headers = Object.assign({}, request.headers()); - headers['FOO'] = 'bar'; - request.continue({ headers }); - }); - await page.goto(server.EMPTY_PAGE); - const [request] = await Promise.all([ - server.waitForRequest('/sleep.zzz'), - page.evaluate(() => fetch('/sleep.zzz')) - ]); - expect(request.headers['foo']).toBe('bar'); - }); it('should fail navigation when aborting main resource', async({page, server}) => { await page.setRequestInterception(true); page.on('request', request => request.abort()); @@ -731,6 +717,66 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { }); }); + describe_fails_ffox('Request.continue', function() { + it('should work', async({page, server}) => { + await page.setRequestInterception(true); + page.on('request', request => request.continue()); + await page.goto(server.EMPTY_PAGE); + }); + it('should amend HTTP headers', async({page, server}) => { + await page.setRequestInterception(true); + page.on('request', request => { + const headers = Object.assign({}, request.headers()); + headers['FOO'] = 'bar'; + request.continue({ headers }); + }); + await page.goto(server.EMPTY_PAGE); + const [request] = await Promise.all([ + server.waitForRequest('/sleep.zzz'), + page.evaluate(() => fetch('/sleep.zzz')) + ]); + expect(request.headers['foo']).toBe('bar'); + }); + it('should redirect in a way non-observable to page', async({page, server}) => { + await page.setRequestInterception(true); + page.on('request', request => { + const redirectURL = request.url().includes('/empty.html') ? server.PREFIX + '/consolelog.html' : undefined; + request.continue({ url: redirectURL }); + }); + let consoleMessage = null; + page.on('console', msg => consoleMessage = msg); + await page.goto(server.EMPTY_PAGE); + expect(page.url()).toBe(server.EMPTY_PAGE); + expect(consoleMessage.text()).toBe('yellow'); + }); + it('should amend method', async({page, server}) => { + await page.goto(server.EMPTY_PAGE); + + await page.setRequestInterception(true); + page.on('request', request => { + request.continue({ method: 'POST' }); + }); + const [request] = await Promise.all([ + server.waitForRequest('/sleep.zzz'), + page.evaluate(() => fetch('/sleep.zzz')) + ]); + expect(request.method).toBe('POST'); + }); + it('should amend post data', async({page, server}) => { + await page.goto(server.EMPTY_PAGE); + + await page.setRequestInterception(true); + page.on('request', request => { + request.continue({ postData: 'doggo' }); + }); + const [serverRequest] = await Promise.all([ + server.waitForRequest('/sleep.zzz'), + page.evaluate(() => fetch('/sleep.zzz', { method: 'POST', body: 'birdy' })) + ]); + expect(await serverRequest.postBody).toBe('doggo'); + }); + }); + describe_fails_ffox('Request.respond', function() { it('should work', async({page, server}) => { await page.setRequestInterception(true); diff --git a/utils/testserver/index.js b/utils/testserver/index.js index 54b102134dc..577c4b8c0ab 100644 --- a/utils/testserver/index.js +++ b/utils/testserver/index.js @@ -189,6 +189,11 @@ class TestServer { else throw error; }); + request.postBody = new Promise(resolve => { + let body = ''; + request.on('data', chunk => body += chunk); + request.on('end', () => resolve(body)); + }); const pathName = url.parse(request.url).path; if (this._auths.has(pathName)) { const auth = this._auths.get(pathName);