Skip to content

Commit

Permalink
JSON support for the Flask test client
Browse files Browse the repository at this point in the history
  • Loading branch information
adambyrtek committed Mar 29, 2015
1 parent 78cd416 commit da16e81
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
15 changes: 14 additions & 1 deletion flask/testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,15 @@
from contextlib import contextmanager
from werkzeug.test import Client, EnvironBuilder
from flask import _request_ctx_stack
from flask.json import dumps as json_dumps

try:
from werkzeug.urls import url_parse
except ImportError:
from urlparse import urlsplit as url_parse


def make_test_environ_builder(app, path='/', base_url=None, *args, **kwargs):
def make_test_environ_builder(app, path='/', base_url=None, json=None, *args, **kwargs):
"""Creates a new test builder with some application defaults thrown in."""
http_host = app.config.get('SERVER_NAME')
app_root = app.config.get('APPLICATION_ROOT')
Expand All @@ -33,6 +34,18 @@ def make_test_environ_builder(app, path='/', base_url=None, *args, **kwargs):
path = url.path
if url.query:
path += '?' + url.query

if json:
if 'data' in kwargs:
raise RuntimeError('Client cannot provide both `json` and `data`')
kwargs['data'] = json_dumps(json)

# Only set Content-Type when not explicitly provided
if 'Content-Type' not in kwargs.get('headers', {}):
new_headers = kwargs.get('headers', {}).copy()
new_headers['Content-Type'] = 'application/json'
kwargs['headers'] = new_headers

return EnvironBuilder(path, base_url, *args, **kwargs)


Expand Down
14 changes: 14 additions & 0 deletions tests/test_testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,20 @@ def action():
assert 'gin' in flask.request.form
assert 'vodka' in flask.request.args

def test_json_request():
app = flask.Flask(__name__)
app.testing = True

@app.route('/api', methods=['POST'])
def api():
return ''

with app.test_client() as c:
json_data = {'drink': {'gin': 1, 'tonic': True}, 'price': 10}
rv = c.post('/api', json=json_data)
assert rv.status_code == 200
assert flask.request.json == json_data

def test_subdomain():
app = flask.Flask(__name__)
app.config['SERVER_NAME'] = 'example.com'
Expand Down

0 comments on commit da16e81

Please sign in to comment.