passerelle/tests/test_jsonresponse.py

178 lines
4.7 KiB
Python

import json
import logging
import pytest
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
from django.http import Http404
from django.test.client import RequestFactory
from passerelle.utils import to_json
class WrappedException(Exception):
pass
class LogAsWarningException(Exception):
err_code = 'logaswarningexception'
http_status = 488
log_error = False
def __str__(self):
return 'log as warning exception'
@to_json()
def wrapped_exception(req, *args, **kwargs):
raise WrappedException
@to_json()
def log_as_warning_exception(req, *args, **kwargs):
raise LogAsWarningException
@to_json()
def http404_exception(req, *args, **kwargs):
raise Http404
@to_json()
def doesnotexist_exception(req, *args, **kwargs):
raise ObjectDoesNotExist
@to_json()
def permissiondenied_exception(req, *args, **kwargs):
raise PermissionDenied
def test_jsonresponselog_get(rf, caplog, settings):
caplog.set_level(logging.ERROR)
wrapped_exception(rf.get('/'))
assert len(caplog.records) == 1
record = caplog.records[0]
assert record.name == 'passerelle.jsonresponse'
assert record.levelno == logging.ERROR
assert hasattr(record, 'method')
if record.method == 'POST':
assert hasattr(record, 'body')
assert 'Error occurred while processing request' in record.message
caplog.clear()
post_payload = {'data': 'plop'}
with pytest.raises(WrappedException):
wrapped_exception(rf.post('/?raise=1', post_payload))
assert len(caplog.records) == 1
caplog.clear()
wrapped_exception(rf.post('/?raise=0', post_payload))
wrapped_exception(rf.post('/?raise=blah', post_payload))
wrapped_exception(rf.post('/?raise', post_payload))
assert len(caplog.records) == 3
def test_jsonresponselog_http404(caplog):
request = RequestFactory()
http404_exception(request.get('/'))
assert caplog.records == []
def test_jsonresponselog_doesnotexist(caplog):
request = RequestFactory()
doesnotexist_exception(request.get('/'))
for record in caplog.records:
assert record.name == 'passerelle.jsonresponse'
assert record.levelno == logging.WARNING
assert 'object not found' in record.message
def test_jsonresponselog_permissiondenied(caplog):
request = RequestFactory()
permissiondenied_exception(request.get('/'))
for record in caplog.records:
assert record.name == 'passerelle.jsonresponse'
assert record.levelno == logging.WARNING
assert 'Permission denied' in record.message
def test_jsonresponse_log_as_warning_exception(caplog):
request = RequestFactory()
response = log_as_warning_exception(request.get('/'))
records = caplog.records
assert len(records) == 1
record = records[0]
assert record.name == 'passerelle.jsonresponse'
assert record.levelno == logging.WARNING
assert hasattr(record, 'method')
assert record.method == 'GET'
assert 'Error occurred while processing request' in record.message
assert response.status_code == 488
data = json.loads(response.content)
assert data['err'] == 'logaswarningexception'
assert data['err_desc'] == 'log as warning exception'
def test_jsonresponse_error_header():
request = RequestFactory()
req = request.get('/')
@to_json()
def test_func(req):
return {'test': 'un test'}
result = test_func(req)
assert result.status_code == 200
data = json.loads(result.content)
assert data == {'test': 'un test', 'err': 0}
@to_json()
def test_func2(req):
class CustomException(Exception):
http_status = 200
raise CustomException
result = test_func2(req)
data = json.loads(result.content)
assert 'err_class' in data
assert 'err' in data
assert data['err'] == 1
assert data['err_class'] == 'tests.test_jsonresponse.CustomException'
assert result.status_code == 200
def test_jsonresponse_with_http4O4_exception():
request = RequestFactory()
response = http404_exception(request.get('/'))
assert response.status_code == 404
def test_jsonresponse_with_callback():
request = RequestFactory()
req = request.get('/?callback=myfunc')
@to_json()
def test_func(req):
return {'foo': 'bar'}
result = test_func(req)
content_type = result.get('Content-Type')
assert 'application/javascript' in content_type
assert result.content.startswith(b'myfunc(')
args = json.loads(result.content[7:-2])
assert args == {'foo': 'bar', 'err': 0}
def test_jsonresponse_with_wrong_callback():
request = RequestFactory()
req = request.get('/?callback=myfunc()')
@to_json()
def test_func(req):
return {'foo': 'bar'}
result = test_func(req)
assert result.status_code == 400