Merge branch '0.4.0' of github.com:graphql-python/graphene into 0.4.0

This commit is contained in:
Syrus Akbary 2015-11-13 20:16:27 -08:00
commit 83589a21b8
5 changed files with 21 additions and 139 deletions

View File

@ -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.'}]}

View File

@ -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))

View File

@ -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

View File

@ -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',
],
},

View File

@ -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