Merge pull request #26 from jhgg/use-graphql-django-view

Use graphql django view
This commit is contained in:
Syrus Akbary 2015-11-13 15:41:14 -08:00
commit 5be22dfc0c
4 changed files with 19 additions and 137 deletions

View File

@ -5,68 +5,6 @@ def format_response(response):
return json.loads(response.content.decode()) return json.loads(response.content.decode())
def test_client_get_no_query(settings, client):
settings.ROOT_URLCONF = 'graphene.contrib.django.tests.test_urls'
response = client.get('/graphql')
json_response = format_response(response)
assert json_response == {'errors': [
{'message': 'Must provide query string.'}]}
def test_client_post_no_query(settings, client):
settings.ROOT_URLCONF = 'graphene.contrib.django.tests.test_urls'
response = client.post('/graphql', {})
json_response = format_response(response)
assert json_response == {'errors': [
{'message': 'Must provide query string.'}]}
def test_client_post_malformed_json(settings, client):
settings.ROOT_URLCONF = 'graphene.contrib.django.tests.test_urls'
response = client.post('/graphql', 'MALFORMED', 'application/json')
json_response = format_response(response)
assert json_response == {'errors': [
{'message': 'Malformed json body in the post data'}]}
def test_client_post_empty_query_json(settings, client):
settings.ROOT_URLCONF = 'graphene.contrib.django.tests.test_urls'
response = client.post(
'/graphql', json.dumps({'query': ''}), 'application/json')
json_response = format_response(response)
assert json_response == {'errors': [
{'message': 'Must provide query string.'}]}
def test_client_post_empty_query_graphql(settings, client):
settings.ROOT_URLCONF = 'graphene.contrib.django.tests.test_urls'
response = client.post(
'/graphql', '', 'application/graphql')
json_response = format_response(response)
assert json_response == {'errors': [
{'message': 'Must provide query string.'}]}
def test_client_post_bad_query_json(settings, client):
settings.ROOT_URLCONF = 'graphene.contrib.django.tests.test_urls'
response = client.post(
'/graphql', json.dumps({'query': '{ MALFORMED'}), 'application/json')
json_response = format_response(response)
assert 'errors' in json_response
assert len(json_response['errors']) == 1
assert 'Syntax Error GraphQL' in json_response['errors'][0]['message']
def test_client_post_bad_query_graphql(settings, client):
settings.ROOT_URLCONF = 'graphene.contrib.django.tests.test_urls'
response = client.post(
'/graphql', '{ MALFORMED', 'application/graphql')
json_response = format_response(response)
assert 'errors' in json_response
assert len(json_response['errors']) == 1
assert 'Syntax Error GraphQL' in json_response['errors'][0]['message']
def test_client_get_good_query(settings, client): def test_client_get_good_query(settings, client):
settings.ROOT_URLCONF = 'graphene.contrib.django.tests.test_urls' settings.ROOT_URLCONF = 'graphene.contrib.django.tests.test_urls'
response = client.get('/graphql', {'query': '{ headline }'}) response = client.get('/graphql', {'query': '{ headline }'})
@ -83,8 +21,7 @@ def test_client_get_good_query_with_raise(settings, client):
settings.ROOT_URLCONF = 'graphene.contrib.django.tests.test_urls' settings.ROOT_URLCONF = 'graphene.contrib.django.tests.test_urls'
response = client.get('/graphql', {'query': '{ raises }'}) response = client.get('/graphql', {'query': '{ raises }'})
json_response = format_response(response) json_response = format_response(response)
assert json_response['errors'][0][ assert json_response['errors'][0]['message'] == 'This field should raise exception'
'message'] == 'This field should raise exception'
assert json_response['data']['raises'] is None assert json_response['data']['raises'] is None
@ -112,10 +49,3 @@ def test_client_post_good_query_graphql(settings, client):
} }
} }
assert json_response == expected_json assert json_response == expected_json
# def test_client_get_bad_query(settings, client):
# settings.ROOT_URLCONF = 'graphene.contrib.django.tests.test_urls'
# response = client.get('/graphql')
# json_response = format_response(response)
# assert json_response == {'errors': [{'message': 'Must provide query string.'}]}

View File

@ -1,67 +1,16 @@
import json from graphql_django_view import GraphQLView as BaseGraphQLView
from django.conf import settings
from django.http import HttpResponse
from django.views.generic import View
from graphql.core.error import GraphQLError, format_error
def form_error(error): class GraphQLView(BaseGraphQLView):
if isinstance(error, GraphQLError): graphene_schema = None
return format_error(error)
return error
def __init__(self, schema, **kwargs):
super(GraphQLView, self).__init__(
graphene_schema=schema,
schema=schema.schema,
executor=schema.executor,
**kwargs
)
class GraphQLView(View): def get_root_value(self, request):
schema = None return self.graphene_schema.query(super(GraphQLView, self).get_root_value(request))
@staticmethod
def format_result(result):
data = {'data': result.data}
if result.errors:
data['errors'] = list(map(form_error, result.errors))
return data
def response_errors(self, *errors):
errors = [{
"message": str(e)
} for e in errors]
return HttpResponse(json.dumps({'errors': errors}), content_type='application/json')
def execute_query(self, request, query, *args, **kwargs):
if not query:
return self.response_errors(Exception("Must provide query string."))
else:
try:
result = self.schema.execute(query, *args, **kwargs)
data = self.format_result(result)
except Exception as e:
if settings.DEBUG:
raise e
return self.response_errors(e)
return HttpResponse(json.dumps(data), content_type='application/json')
def get(self, request, *args, **kwargs):
query = request.GET.get('query')
return self.execute_query(request, query or '')
@staticmethod
def get_content_type(request):
meta = request.META
return meta.get('CONTENT_TYPE', meta.get('HTTP_CONTENT_TYPE', ''))
def post(self, request, *args, **kwargs):
content_type = self.get_content_type(request)
if content_type == 'application/json':
try:
received_json_data = json.loads(request.body.decode())
query = received_json_data.get('query')
except ValueError:
return self.response_errors(ValueError("Malformed json body in the post data"))
elif content_type == 'application/graphql':
query = request.body.decode()
else:
query = request.POST.get('query') or request.GET.get('query')
return self.execute_query(request, query or '')

View File

@ -56,7 +56,7 @@ setup(
install_requires=[ install_requires=[
'six>=1.10.0', 'six>=1.10.0',
'blinker', 'blinker',
'graphql-core==0.4.7b0', 'graphql-core==0.4.7b2',
'graphql-relay==0.3.3' 'graphql-relay==0.3.3'
], ],
tests_require=[ tests_require=[
@ -68,6 +68,7 @@ setup(
'django': [ 'django': [
'Django>=1.6.0,<1.9', 'Django>=1.6.0,<1.9',
'singledispatch>=3.4.0.3', 'singledispatch>=3.4.0.3',
'graphql-django-view>=1.0.0',
], ],
}, },

View File

@ -7,15 +7,17 @@ deps=
pytest>=2.7.2 pytest>=2.7.2
django>=1.8.0,<1.9 django>=1.8.0,<1.9
pytest-django pytest-django
graphql-core==0.4.7b0 graphql-django-view>=1.0.0
graphql-core==0.4.7b2
graphql-relay==0.3.3 graphql-relay==0.3.3
six six
blinker blinker
singledispatch singledispatch
mock
setenv = setenv =
PYTHONPATH = .:{envdir} PYTHONPATH = .:{envdir}
commands= commands=
py.test tests/ examples/ py.test
[testenv:flake8] [testenv:flake8]
deps = flake8 deps = flake8