Skip to content

Commit 334c279

Browse files
authored
fix: fulfill with json (microsoft#1700)
Resolves microsoft#1693. Relates microsoft/playwright#19184 (original upstream change). Relates microsoft#1684 (original Python rolling introducing the feature to the port).
1 parent e341b9a commit 334c279

File tree

3 files changed

+105
-2
lines changed

3 files changed

+105
-2
lines changed

playwright/_impl/_network.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import base64
1717
import inspect
1818
import json
19+
import json as json_utils
1920
import mimetypes
2021
import sys
2122
from collections import defaultdict
@@ -288,6 +289,12 @@ async def fulfill(
288289
) -> None:
289290
self._check_not_handled()
290291
params = locals_to_params(locals())
292+
293+
if json is not None:
294+
if body is not None:
295+
raise Error("Can specify either body or json parameters")
296+
body = json_utils.dumps(json)
297+
291298
if response:
292299
del params["response"]
293300
params["status"] = (
@@ -298,8 +305,6 @@ async def fulfill(
298305
)
299306
from playwright._impl._fetch import APIResponse
300307

301-
if json is not None:
302-
body = json.dumps(json)
303308
if body is None and path is None and isinstance(response, APIResponse):
304309
if response._request._connection is self._connection:
305310
params["fetchResponseUid"] = response._fetch_uid

tests/async/test_request_fulfill.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import json
16+
1517
from playwright.async_api import Page, Route
1618
from tests.server import Server
1719

@@ -25,3 +27,52 @@ async def handle(route: Route):
2527
response = await page.goto(server.PREFIX + "/title.html")
2628
assert response.status == 200
2729
assert await page.title() == "Woof-Woof"
30+
31+
32+
async def test_should_fulfill_json(page: Page, server: Server) -> None:
33+
async def handle(route: Route) -> None:
34+
await route.fulfill(status=201, headers={"foo": "bar"}, json={"bar": "baz"})
35+
36+
await page.route("**/*", handle)
37+
38+
response = await page.goto(server.EMPTY_PAGE)
39+
assert response
40+
assert response.status == 201
41+
assert response.headers["content-type"] == "application/json"
42+
assert json.loads(await page.evaluate("document.body.textContent")) == {
43+
"bar": "baz"
44+
}
45+
46+
47+
async def test_should_fulfill_json_overriding_existing_response(
48+
page: Page, server: Server
49+
) -> None:
50+
server.set_route(
51+
"/tags",
52+
lambda request: (
53+
request.setHeader("foo", "bar"),
54+
request.write('{"tags": ["a", "b"]}'.encode()),
55+
request.finish(),
56+
),
57+
)
58+
59+
original = {}
60+
61+
async def handle(route: Route) -> None:
62+
response = await route.fetch()
63+
json = await response.json()
64+
original["tags"] = json["tags"]
65+
json["tags"] = ["c"]
66+
await route.fulfill(response=response, json=json)
67+
68+
await page.route("**/*", handle)
69+
70+
response = await page.goto(server.PREFIX + "/tags")
71+
assert response
72+
assert response.status == 200
73+
assert response.headers["content-type"] == "application/json"
74+
assert response.headers["foo"] == "bar"
75+
assert original["tags"] == ["a", "b"]
76+
assert json.loads(await page.evaluate("document.body.textContent")) == {
77+
"tags": ["c"]
78+
}

tests/sync/test_request_fulfill.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import json
16+
1517
from playwright.sync_api import Page, Route
1618
from tests.server import Server
1719

@@ -26,3 +28,48 @@ def handle(route: Route) -> None:
2628
assert response
2729
assert response.status == 200
2830
assert page.title() == "Woof-Woof"
31+
32+
33+
def test_should_fulfill_json(page: Page, server: Server) -> None:
34+
def handle(route: Route) -> None:
35+
route.fulfill(status=201, headers={"foo": "bar"}, json={"bar": "baz"})
36+
37+
page.route("**/*", handle)
38+
39+
response = page.goto(server.EMPTY_PAGE)
40+
assert response
41+
assert response.status == 201
42+
assert response.headers["content-type"] == "application/json"
43+
assert json.loads(page.evaluate("document.body.textContent")) == {"bar": "baz"}
44+
45+
46+
def test_should_fulfill_json_overriding_existing_response(
47+
page: Page, server: Server
48+
) -> None:
49+
server.set_route(
50+
"/tags",
51+
lambda request: (
52+
request.setHeader("foo", "bar"),
53+
request.write('{"tags": ["a", "b"]}'.encode()),
54+
request.finish(),
55+
),
56+
)
57+
58+
original = {}
59+
60+
def handle(route: Route) -> None:
61+
response = route.fetch()
62+
json = response.json()
63+
original["tags"] = json["tags"]
64+
json["tags"] = ["c"]
65+
route.fulfill(response=response, json=json)
66+
67+
page.route("**/*", handle)
68+
69+
response = page.goto(server.PREFIX + "/tags")
70+
assert response
71+
assert response.status == 200
72+
assert response.headers["content-type"] == "application/json"
73+
assert response.headers["foo"] == "bar"
74+
assert original["tags"] == ["a", "b"]
75+
assert json.loads(page.evaluate("document.body.textContent")) == {"tags": ["c"]}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy