diff --git a/sanic/testing.py b/sanic/testing.py index 787106a6..09554e21 100644 --- a/sanic/testing.py +++ b/sanic/testing.py @@ -1,4 +1,5 @@ import traceback +from json import JSONDecodeError from sanic.log import log @@ -28,6 +29,12 @@ class SanicTestClient: response.text = await response.text() except UnicodeDecodeError as e: response.text = None + + try: + response.json = await response.json() + except (JSONDecodeError, UnicodeDecodeError): + response.json = None + response.body = await response.read() return response diff --git a/tests/test_blueprints.py b/tests/test_blueprints.py index d9f5cd61..9ab387be 100644 --- a/tests/test_blueprints.py +++ b/tests/test_blueprints.py @@ -41,6 +41,7 @@ def test_bp_strict_slash(): request, response = app.test_client.get('/get') assert response.text == 'OK' + assert response.json == None request, response = app.test_client.get('/get/') assert response.status == 404 diff --git a/tests/test_response.py b/tests/test_response.py index ba87f68d..fb213b56 100644 --- a/tests/test_response.py +++ b/tests/test_response.py @@ -9,10 +9,12 @@ import pytest from random import choice from sanic import Sanic -from sanic.response import HTTPResponse, stream, StreamingHTTPResponse, file, file_stream +from sanic.response import HTTPResponse, stream, StreamingHTTPResponse, file, file_stream, json from sanic.testing import HOST, PORT from unittest.mock import MagicMock +JSON_DATA = {'ok': True} + def test_response_body_not_a_string(): @@ -34,6 +36,24 @@ async def sample_streaming_fn(response): response.write('bar') +@pytest.fixture +def json_app(): + app = Sanic('json') + + @app.route("/") + async def test(request): + return json(JSON_DATA) + + return app + + +def test_json_response(json_app): + from sanic.response import json_dumps + request, response = json_app.test_client.get('/') + assert response.status == 200 + assert response.text == json_dumps(JSON_DATA) + assert response.json == JSON_DATA + @pytest.fixture def streaming_app(): app = Sanic('streaming')