Skip to content

Commit 7d646d0

Browse files
authored
cherry-pick(#1700): fix: fulfill with json (#1701)
fix: fulfill with json (#1700) Resolves #1693. Relates microsoft/playwright#19184 (original upstream change). Relates #1684 (original Python rolling introducing the feature to the port).
1 parent af2a06b commit 7d646d0

File tree

3 files changed

+105
-2
lines changed

3 files changed

+105
-2
lines changed

Diff for: playwright/_impl/_network.py

+7-2
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

Diff for: tests/async/test_request_fulfill.py

+51
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+
}

Diff for: tests/sync/test_request_fulfill.py

+47
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)