diff --git a/graphene/contrib/django/tests/test_views.py b/graphene/contrib/django/tests/test_views.py index c9b88751..f82be99f 100644 --- a/graphene/contrib/django/tests/test_views.py +++ b/graphene/contrib/django/tests/test_views.py @@ -5,68 +5,6 @@ def format_response(response): 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): settings.ROOT_URLCONF = 'graphene.contrib.django.tests.test_urls' 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' response = client.get('/graphql', {'query': '{ raises }'}) json_response = format_response(response) - assert json_response['errors'][0][ - 'message'] == 'This field should raise exception' + assert json_response['errors'][0]['message'] == 'This field should raise exception' 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 - - -# 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.'}]} diff --git a/graphene/contrib/django/views.py b/graphene/contrib/django/views.py index cb415df6..ad245d72 100644 --- a/graphene/contrib/django/views.py +++ b/graphene/contrib/django/views.py @@ -1,67 +1,16 @@ -import json - -from django.conf import settings -from django.http import HttpResponse -from django.views.generic import View - -from graphql.core.error import GraphQLError, format_error +from graphql_django_view import GraphQLView as BaseGraphQLView -def form_error(error): - if isinstance(error, GraphQLError): - return format_error(error) - return error +class GraphQLView(BaseGraphQLView): + graphene_schema = None + def __init__(self, schema, **kwargs): + super(GraphQLView, self).__init__( + graphene_schema=schema, + schema=schema.schema, + executor=schema.executor, + **kwargs + ) -class GraphQLView(View): - schema = None - - @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 '') + def get_root_value(self, request): + return self.graphene_schema.query(super(GraphQLView, self).get_root_value(request)) diff --git a/graphene/core/types/objecttype.py b/graphene/core/types/objecttype.py index 342aeeff..e2a20de4 100644 --- a/graphene/core/types/objecttype.py +++ b/graphene/core/types/objecttype.py @@ -6,8 +6,8 @@ from functools import partial import six from graphene import signals -from graphql.core.type import (GraphQLArgument, GraphQLInputObjectType, - GraphQLInterfaceType, GraphQLObjectType) +from graphql.core.type import (GraphQLInputObjectType, GraphQLInterfaceType, + GraphQLObjectType) from ..exceptions import SkipField from ..options import Options diff --git a/setup.py b/setup.py index 216fa2d3..5e6a44df 100644 --- a/setup.py +++ b/setup.py @@ -56,7 +56,7 @@ setup( install_requires=[ 'six>=1.10.0', 'blinker', - 'graphql-core==0.4.7b0', + 'graphql-core==0.4.7b2', 'graphql-relay==0.3.3' ], tests_require=[ @@ -68,6 +68,7 @@ setup( 'django': [ 'Django>=1.6.0,<1.9', 'singledispatch>=3.4.0.3', + 'graphql-django-view>=1.0.0', ], }, diff --git a/tox.ini b/tox.ini index e439ab84..45cf7fdd 100644 --- a/tox.ini +++ b/tox.ini @@ -7,15 +7,17 @@ deps= pytest>=2.7.2 django>=1.8.0,<1.9 pytest-django - graphql-core==0.4.7b0 + graphql-django-view>=1.0.0 + graphql-core==0.4.7b2 graphql-relay==0.3.3 six blinker singledispatch + mock setenv = PYTHONPATH = .:{envdir} commands= - py.test tests/ examples/ + py.test [testenv:flake8] deps = flake8