misc: use json method to load JSON responses (#35425)

This commit is contained in:
Frédéric Péters 2019-08-18 13:21:51 +02:00
parent e42143e009
commit 826acc3b24
4 changed files with 30 additions and 26 deletions

View File

@ -1170,7 +1170,7 @@ class JsonCellBase(CellBase):
if json_response.status_code // 100 == 2:
if json_response.status_code != 204: # 204 = No Content
try:
extra_context[data_key] = json.loads(json_response.content)
extra_context[data_key] = json_response.json()
except ValueError:
extra_context[data_key + '_error'] = 'invalid_json'
logger = logging.getLogger(__name__)
@ -1181,7 +1181,7 @@ class JsonCellBase(CellBase):
continue
elif json_response.headers.get('content-type') == 'application/json':
try:
extra_context[data_key + '_error'] = json.loads(json_response.content)
extra_context[data_key + '_error'] = json_response.json()
except ValueError:
extra_context[data_key + '_error'] = 'invalid_json'

View File

@ -14,7 +14,7 @@ from django.test.client import RequestFactory
from django.test.utils import CaptureQueriesContext
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from django.utils.encoding import force_text
from django.utils.encoding import force_text, force_bytes
from combo.data.library import get_cell_classes
from combo.utils import NothingInCacheException
@ -23,6 +23,10 @@ from .test_manager import login
pytestmark = pytest.mark.django_db
def mock_json_response(content, **kwargs):
content = force_bytes(content)
text = force_text(content)
return mock.Mock(content=content, text=text, json=lambda: json.loads(text), **kwargs)
def test_cell_reference():
page = Page()
@ -215,21 +219,21 @@ def test_json_cell():
with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': [{'url': 'xxx', 'text': 'xxx'}]}
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=200)
requests_get.return_value = mock_json_response(content=json.dumps(data), status_code=200)
context = cell.get_cell_extra_context({})
assert context['json'] == data
assert context['json_url'] == 'http://example.net/'
assert context['json_status'] == 200
assert 'json_error' not in context
requests_get.return_value = mock.Mock(status_code=204) # 204 : No Content
requests_get.return_value = mock_json_response(content='', status_code=204) # 204 : No Content
context = cell.get_cell_extra_context({})
assert context['json'] is None
assert context['json_url'] == 'http://example.net/'
assert context['json_status'] == 204
assert 'json_error' not in context
requests_get.return_value = mock.Mock(content='not found', status_code=404,
requests_get.return_value = mock_json_response(content='not found', status_code=404,
headers={})
context = cell.get_cell_extra_context({})
assert context['json'] is None
@ -237,7 +241,7 @@ def test_json_cell():
assert context['json_status'] == 404
assert 'json_error' not in context
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=404,
requests_get.return_value = mock_json_response(content=json.dumps(data), status_code=404,
headers={'content-type': 'application/json'})
context = cell.get_cell_extra_context({})
assert context['json'] is None
@ -256,7 +260,7 @@ def test_json_cell():
assert isinstance(context['json_exception'], requests.ConnectionError)
cell.url = '' # no URL -> no request, no data, no status
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=200)
requests_get.return_value = mock_json_response(content=json.dumps(data), status_code=200)
context = cell.get_cell_extra_context({})
assert context['json'] is None
assert context['json_url'] == ''
@ -269,7 +273,7 @@ def test_json_cell():
with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': [{'url': 'http://a.b', 'text': 'xxx'}]}
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=200)
requests_get.return_value = mock_json_response(content=json.dumps(data), status_code=200)
cell.url = 'http://test4'
result = cell.render({'synchronous': True})
assert 'http://a.b' in result
@ -280,7 +284,7 @@ def test_json_cell():
assert result == 'xxx'
with mock.patch('combo.utils.requests.get') as requests_get:
requests_get.return_value = mock.Mock(content='garbage', status_code=200)
requests_get.return_value = mock_json_response(content='garbage', status_code=200)
cell.url = 'http://test5'
result = cell.render({'synchronous': True})
assert result == ''
@ -296,7 +300,7 @@ def test_json_cell():
data = {'data': [{'url': 'xxx', 'text': 'xxx'}]}
cell.url = 'http://testuser?[foobar]'
with mock.patch('combo.utils.requests.get') as requests_get:
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=200)
requests_get.return_value = mock_json_response(content=json.dumps(data), status_code=200)
context = cell.get_cell_extra_context({'foobar': 'barfoo'})
assert context['json'] == data
assert context['json_url'] == 'http://testuser?barfoo'
@ -313,7 +317,7 @@ def test_json_cell():
request.user = User(username='foo', email='foo@example.net')
cell.url = 'http://testuser?email=[user_email]'
with mock.patch('combo.utils.requests.get') as requests_get:
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=200)
requests_get.return_value = mock_json_response(content=json.dumps(data), status_code=200)
context = cell.get_cell_extra_context({'request': request})
assert context['json'] == data
assert context['json_url'] == 'http://testuser?email=foo%40example.net'
@ -338,7 +342,7 @@ def test_json_cell_with_varnames(app):
with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': []}
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=200)
requests_get.return_value = mock_json_response(content=json.dumps(data), status_code=200)
url = reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()})
resp = app.get(url + '?var1=foo&var2=bar') # request query string is here
@ -363,7 +367,7 @@ def test_config_json_cell():
assert cell.css_class_names.split() == ['configjsoncell', 'foobar']
with mock.patch('combo.utils.requests.get') as requests_get:
requests_get.return_value = mock.Mock(content=json.dumps({'hello': 'world'}), status_code=200)
requests_get.return_value = mock_json_response(content=json.dumps({'hello': 'world'}), status_code=200)
context = cell.get_cell_extra_context({'request': request})
assert context['json'] == {'hello': 'world'}
assert context['json_url'] == 'http://test/'
@ -404,7 +408,7 @@ def test_config_json_cell_with_varnames(app):
with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': []}
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=200)
requests_get.return_value = mock_json_response(content=json.dumps(data), status_code=200)
url = reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()})
resp = app.get(url + '?var1=foo&var2=bar') # request query string is here
@ -458,7 +462,7 @@ def test_config_json_cell_with_param_in_url(app):
with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': []}
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=200)
requests_get.return_value = mock_json_response(content=json.dumps(data), status_code=200)
url = reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()})
resp = app.get(url)
@ -473,7 +477,7 @@ def test_json_force_async():
cell.template_string = '{{json.hello}}'
cell.force_async = True
with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as requests_get:
requests_get.return_value = mock.Mock(content=json.dumps({'hello': 'world'}), status_code=200)
requests_get.return_value = mock_json_response(content=json.dumps({'hello': 'world'}), status_code=200)
with pytest.raises(NothingInCacheException):
cell.render({})
assert cell.render({'synchronous': True}) == 'world'
@ -489,7 +493,7 @@ def test_json_force_async():
cell.template_string = '{{json.hello}}'
cell.force_async = False
with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as requests_get:
requests_get.return_value = mock.Mock(content=json.dumps({'hello': 'world2'}), status_code=200)
requests_get.return_value = mock_json_response(content=json.dumps({'hello': 'world2'}), status_code=200)
# raise if nothing in cache
with pytest.raises(NothingInCacheException):
cell.render({})
@ -522,7 +526,7 @@ def test_config_json_cell_additional_url(app):
with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': 'toto'}
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=200)
requests_get.return_value = mock_json_response(content=json.dumps(data), status_code=200)
url = reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()})
resp = app.get(url)
@ -537,7 +541,7 @@ def test_config_json_cell_additional_url(app):
with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': 'toto'}
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=404,
requests_get.return_value = mock_json_response(content=json.dumps(data), status_code=404,
headers={'content-type': 'application/json'})
url = reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()})
@ -558,7 +562,7 @@ def test_config_json_cell_additional_url(app):
with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': 'toto'}
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=200)
requests_get.return_value = mock_json_response(content=json.dumps(data), status_code=200)
context = cell.get_cell_extra_context({})
assert context['json'] == data
assert context['json_url'] == 'http://foo'
@ -591,7 +595,7 @@ def test_config_json_cell_additional_url(app):
data = {'data': 'bar'}
with mock.patch('combo.utils.requests.get') as requests_get:
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=200)
requests_get.return_value = mock_json_response(content=json.dumps(data), status_code=200)
url = reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()})
resp = app.get(url)
@ -618,7 +622,7 @@ def test_config_json_cell_additional_url(app):
assert context['plop2_status'] == 200
with mock.patch('combo.utils.requests.get') as requests_get:
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=404,
requests_get.return_value = mock_json_response(content=json.dumps(data), status_code=404,
headers={'content-type': 'application/json'})
url = reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()})

View File

@ -1102,7 +1102,7 @@ def test_page_versionning(app, admin_user):
with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': [{'url': 'xxx', 'text': 'xxx'}]}
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=200)
requests_get.return_value = mock.Mock(json=lambda: data, status_code=200)
resp3 = app.get(json_cell_url)
assert resp3.text.strip() == 'CxxxD'
@ -1112,7 +1112,7 @@ def test_page_versionning(app, admin_user):
with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': [{'url': 'xxx', 'text': 'xxx'}]}
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=200)
requests_get.return_value = mock.Mock(json=lambda: data, status_code=200)
resp3 = app.get(json_cell_url)
assert resp3.text.strip() == 'AxxxB'

View File

@ -157,7 +157,7 @@ def test_search_global_context(app):
with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': []}
requests_get.return_value = mock.Mock(content=json.dumps(data), status_code=200)
requests_get.return_value = mock.Mock(json=lambda: data, status_code=200)
resp = app.get(url)
assert requests_get.call_args[0][0] == 'http://www.example.net/search/foo/'