def execute_graphql_request(self, request): query, variables, operation_name = self.get_graphql_params(request, self.parse_body(request)) if not query: raise HttpError(HttpResponseBadRequest('Must provide query string.')) source = Source(query, name='GraphQL request') try: document_ast = parse(source) except Exception as e: return ExecutionResult(errors=[e], invalid=True) if request.method.lower() == 'get': operation_ast = get_operation_ast(document_ast, operation_name) if operation_ast and operation_ast.operation != 'query': raise HttpError(HttpResponseNotAllowed( ['POST'], 'Can only perform a {} operation from a POST request.'.format(operation_ast.operation) )) try: return self.execute( document_ast, self.get_root_value(request), variables, operation_name=operation_name, request_context=self.get_request_context(request) ) except Exception as e: return ExecutionResult(errors=[e], invalid=True)
def test_gets_an_operation_from_a_document_with_named_mutation_operation(): doc = parse('mutation Test { field }') assert get_operation_ast(doc) == doc.definitions[0]
def test_does_not_get_fragment_with_same_name_query(): doc = parse('fragment Foo on Type { field } query Foo { field }') assert get_operation_ast(doc) == doc.definitions[1] assert get_operation_ast(doc, 'Foo') == doc.definitions[1]
def test_does_not_get_fragment(): doc = parse('fragment Foo on Type { field }') assert not get_operation_ast(doc) assert not get_operation_ast(doc, 'Foo')
def test_gets_an_operation_from_a_simple_document(): doc = parse('{ field }') assert get_operation_ast(doc) == doc.definitions[0]
def test_gets_named_operation(): doc = parse('query TestQ { field } mutation TestM { field } subscription TestS { field }') assert get_operation_ast(doc, 'TestQ') == doc.definitions[0] assert get_operation_ast(doc, 'TestM') == doc.definitions[1] assert get_operation_ast(doc, 'TestS') == doc.definitions[2]
def test_does_not_get_misnamed_operation(): doc = parse('query TestQ { field } mutation TestM { field } subscription TestSub { field }') assert not get_operation_ast(doc, 'Unknown')
def test_does_not_get_ambiguous_named_operation(): doc = parse('query TestQ { field } mutation TestM { field } subscription TestSub { field }') assert not get_operation_ast(doc)
def test_does_not_get_missing_operation(): doc = parse('{ field } mutation Test { field }') assert not get_operation_ast(doc)