You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.6 KiB
64 lines
2.6 KiB
import json
|
|
|
|
from rest_framework.test import APIClient
|
|
|
|
|
|
class BetterAPIClient(APIClient):
|
|
"""Implements status code checks and json parsing."""
|
|
|
|
def _check_response(self, response, status, parse):
|
|
# Check status code
|
|
if status is not None:
|
|
assert response.status_code == status, \
|
|
'expected: {}, got: {}, response:\n{}' \
|
|
.format(status, response.status_code, response.content)
|
|
# Parse response body
|
|
if parse:
|
|
response.data = json.loads(response.content.decode())
|
|
|
|
def _process_data(self, data, content_type):
|
|
if content_type == 'application/json':
|
|
data = json.dumps(data)
|
|
return data
|
|
|
|
def get(self, path, data=None, follow=False, status=200, parse=True,
|
|
content_type='application/json', **extra):
|
|
response = super(BetterAPIClient, self).get(
|
|
path, data=data, follow=follow, **extra)
|
|
self._check_response(response, status, parse)
|
|
return response
|
|
|
|
def post(self, path, data=None, format=None,
|
|
content_type='application/json', follow=False, status=201,
|
|
parse=True, **extra):
|
|
data = self._process_data(data, content_type)
|
|
response = super(BetterAPIClient, self).post(
|
|
path, data=data, format=format, content_type=content_type, **extra)
|
|
self._check_response(response, status, parse)
|
|
return response
|
|
|
|
def put(self, path, data=None, format=None,
|
|
content_type='application/json', follow=False, status=200,
|
|
parse=True, **extra):
|
|
data = self._process_data(data, content_type)
|
|
response = super(APIClient, self).put(
|
|
path, data=data, format=format, content_type=content_type, **extra)
|
|
self._check_response(response, status, parse)
|
|
return response
|
|
|
|
def patch(self, path, data=None, format=None,
|
|
content_type='application/json', follow=False, status=200,
|
|
parse=True, **extra):
|
|
data = self._process_data(data, content_type)
|
|
response = super(APIClient, self).patch(
|
|
path, data=data, format=format, content_type=content_type, **extra)
|
|
self._check_response(response, status, parse)
|
|
return response
|
|
|
|
def delete(self, path, data=None, format=None,
|
|
content_type='application/json', follow=False, status=204,
|
|
parse=True, **extra):
|
|
data = self._process_data(data, content_type)
|
|
response = super(APIClient, self).delete(
|
|
path, data=data, format=format, content_type=content_type, **extra)
|
|
return response
|
|
|