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 // 100 == 2:
if json_response.status_code != 204: # 204 = No Content if json_response.status_code != 204: # 204 = No Content
try: try:
extra_context[data_key] = json.loads(json_response.content) extra_context[data_key] = json_response.json()
except ValueError: except ValueError:
extra_context[data_key + '_error'] = 'invalid_json' extra_context[data_key + '_error'] = 'invalid_json'
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -1181,7 +1181,7 @@ class JsonCellBase(CellBase):
continue continue
elif json_response.headers.get('content-type') == 'application/json': elif json_response.headers.get('content-type') == 'application/json':
try: try:
extra_context[data_key + '_error'] = json.loads(json_response.content) extra_context[data_key + '_error'] = json_response.json()
except ValueError: except ValueError:
extra_context[data_key + '_error'] = 'invalid_json' 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.test.utils import CaptureQueriesContext
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.urlresolvers import reverse 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.data.library import get_cell_classes
from combo.utils import NothingInCacheException from combo.utils import NothingInCacheException
@ -23,6 +23,10 @@ from .test_manager import login
pytestmark = pytest.mark.django_db 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(): def test_cell_reference():
page = Page() page = Page()
@ -215,21 +219,21 @@ def test_json_cell():
with mock.patch('combo.utils.requests.get') as requests_get: with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': [{'url': 'xxx', 'text': 'xxx'}]} 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({}) context = cell.get_cell_extra_context({})
assert context['json'] == data assert context['json'] == data
assert context['json_url'] == 'http://example.net/' assert context['json_url'] == 'http://example.net/'
assert context['json_status'] == 200 assert context['json_status'] == 200
assert 'json_error' not in context 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({}) context = cell.get_cell_extra_context({})
assert context['json'] is None assert context['json'] is None
assert context['json_url'] == 'http://example.net/' assert context['json_url'] == 'http://example.net/'
assert context['json_status'] == 204 assert context['json_status'] == 204
assert 'json_error' not in context 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={}) headers={})
context = cell.get_cell_extra_context({}) context = cell.get_cell_extra_context({})
assert context['json'] is None assert context['json'] is None
@ -237,7 +241,7 @@ def test_json_cell():
assert context['json_status'] == 404 assert context['json_status'] == 404
assert 'json_error' not in context 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'}) headers={'content-type': 'application/json'})
context = cell.get_cell_extra_context({}) context = cell.get_cell_extra_context({})
assert context['json'] is None assert context['json'] is None
@ -256,7 +260,7 @@ def test_json_cell():
assert isinstance(context['json_exception'], requests.ConnectionError) assert isinstance(context['json_exception'], requests.ConnectionError)
cell.url = '' # no URL -> no request, no data, no status 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({}) context = cell.get_cell_extra_context({})
assert context['json'] is None assert context['json'] is None
assert context['json_url'] == '' assert context['json_url'] == ''
@ -269,7 +273,7 @@ def test_json_cell():
with mock.patch('combo.utils.requests.get') as requests_get: with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': [{'url': 'http://a.b', 'text': 'xxx'}]} 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' cell.url = 'http://test4'
result = cell.render({'synchronous': True}) result = cell.render({'synchronous': True})
assert 'http://a.b' in result assert 'http://a.b' in result
@ -280,7 +284,7 @@ def test_json_cell():
assert result == 'xxx' assert result == 'xxx'
with mock.patch('combo.utils.requests.get') as requests_get: 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' cell.url = 'http://test5'
result = cell.render({'synchronous': True}) result = cell.render({'synchronous': True})
assert result == '' assert result == ''
@ -296,7 +300,7 @@ def test_json_cell():
data = {'data': [{'url': 'xxx', 'text': 'xxx'}]} data = {'data': [{'url': 'xxx', 'text': 'xxx'}]}
cell.url = 'http://testuser?[foobar]' cell.url = 'http://testuser?[foobar]'
with mock.patch('combo.utils.requests.get') as requests_get: 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'}) context = cell.get_cell_extra_context({'foobar': 'barfoo'})
assert context['json'] == data assert context['json'] == data
assert context['json_url'] == 'http://testuser?barfoo' assert context['json_url'] == 'http://testuser?barfoo'
@ -313,7 +317,7 @@ def test_json_cell():
request.user = User(username='foo', email='foo@example.net') request.user = User(username='foo', email='foo@example.net')
cell.url = 'http://testuser?email=[user_email]' cell.url = 'http://testuser?email=[user_email]'
with mock.patch('combo.utils.requests.get') as requests_get: 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}) context = cell.get_cell_extra_context({'request': request})
assert context['json'] == data assert context['json'] == data
assert context['json_url'] == 'http://testuser?email=foo%40example.net' 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: with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': []} 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', url = reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()}) kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()})
resp = app.get(url + '?var1=foo&var2=bar') # request query string is here 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'] assert cell.css_class_names.split() == ['configjsoncell', 'foobar']
with mock.patch('combo.utils.requests.get') as requests_get: 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}) context = cell.get_cell_extra_context({'request': request})
assert context['json'] == {'hello': 'world'} assert context['json'] == {'hello': 'world'}
assert context['json_url'] == 'http://test/' 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: with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': []} 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', url = reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()}) kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()})
resp = app.get(url + '?var1=foo&var2=bar') # request query string is here 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: with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': []} 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', url = reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()}) kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()})
resp = app.get(url) resp = app.get(url)
@ -473,7 +477,7 @@ def test_json_force_async():
cell.template_string = '{{json.hello}}' cell.template_string = '{{json.hello}}'
cell.force_async = True cell.force_async = True
with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as requests_get: 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): with pytest.raises(NothingInCacheException):
cell.render({}) cell.render({})
assert cell.render({'synchronous': True}) == 'world' assert cell.render({'synchronous': True}) == 'world'
@ -489,7 +493,7 @@ def test_json_force_async():
cell.template_string = '{{json.hello}}' cell.template_string = '{{json.hello}}'
cell.force_async = False cell.force_async = False
with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as requests_get: 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 # raise if nothing in cache
with pytest.raises(NothingInCacheException): with pytest.raises(NothingInCacheException):
cell.render({}) cell.render({})
@ -522,7 +526,7 @@ def test_config_json_cell_additional_url(app):
with mock.patch('combo.utils.requests.get') as requests_get: with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': 'toto'} 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', url = reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()}) kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()})
resp = app.get(url) 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: with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': 'toto'} 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'}) headers={'content-type': 'application/json'})
url = reverse('combo-public-ajax-page-cell', url = reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()}) 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: with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': 'toto'} 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({}) context = cell.get_cell_extra_context({})
assert context['json'] == data assert context['json'] == data
assert context['json_url'] == 'http://foo' assert context['json_url'] == 'http://foo'
@ -591,7 +595,7 @@ def test_config_json_cell_additional_url(app):
data = {'data': 'bar'} data = {'data': 'bar'}
with mock.patch('combo.utils.requests.get') as requests_get: 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', url = reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()}) kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()})
resp = app.get(url) resp = app.get(url)
@ -618,7 +622,7 @@ def test_config_json_cell_additional_url(app):
assert context['plop2_status'] == 200 assert context['plop2_status'] == 200
with mock.patch('combo.utils.requests.get') as requests_get: 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'}) headers={'content-type': 'application/json'})
url = reverse('combo-public-ajax-page-cell', url = reverse('combo-public-ajax-page-cell',
kwargs={'page_pk': page.id, 'cell_reference': cell.get_reference()}) 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: with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': [{'url': 'xxx', 'text': 'xxx'}]} 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) resp3 = app.get(json_cell_url)
assert resp3.text.strip() == 'CxxxD' 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: with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': [{'url': 'xxx', 'text': 'xxx'}]} 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) resp3 = app.get(json_cell_url)
assert resp3.text.strip() == 'AxxxB' 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: with mock.patch('combo.utils.requests.get') as requests_get:
data = {'data': []} 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) resp = app.get(url)
assert requests_get.call_args[0][0] == 'http://www.example.net/search/foo/' assert requests_get.call_args[0][0] == 'http://www.example.net/search/foo/'