Skip to content

Commit 5b190d3

Browse files
committed
Implement get_operation_ast utility
#5
1 parent 93ed376 commit 5b190d3

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from ...core.language import ast
2+
3+
4+
def get_operation_ast(document_ast, operation_name=None):
5+
operation = None
6+
7+
for definition in document_ast.definitions:
8+
if isinstance(definition, ast.OperationDefinition):
9+
if not operation_name:
10+
# If no operation name is provided, only return an Operation if it is the only one present in the
11+
# document. This means that if we've encountered a second operation as we were iterating over the
12+
# definitions in the document, there are more than one Operation defined, and we should return None.
13+
if operation:
14+
return None
15+
16+
operation = definition
17+
18+
elif definition.name and definition.name.value == operation_name:
19+
return definition
20+
21+
return operation
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from graphql.core import parse
2+
from graphql.core.utils.get_operation_ast import get_operation_ast
3+
4+
5+
def test_gets_an_operation_from_a_simple_document():
6+
doc = parse('{ field }')
7+
assert get_operation_ast(doc) == doc.definitions[0]
8+
9+
10+
def test_gets_an_operation_from_a_document_with_named_operation():
11+
doc = parse('mutation Test { field }')
12+
assert get_operation_ast(doc) == doc.definitions[0]
13+
14+
15+
def test_does_not_get_missing_operation():
16+
doc = parse('{ field } mutation Test { field }')
17+
assert not get_operation_ast(doc)
18+
19+
20+
def test_does_not_get_ambiguous_unnamed_operation():
21+
doc = parse('query TestQ { field } mutation TestM { field }')
22+
assert not get_operation_ast(doc)
23+
24+
25+
def test_does_not_get_misnamed_operation():
26+
doc = parse('query TestQ { field } mutation TestM { field }')
27+
assert not get_operation_ast(doc, 'Unknown')
28+
29+
30+
def test_gets_named_operation():
31+
doc = parse('query TestQ { field } mutation TestM { field }')
32+
assert get_operation_ast(doc, 'TestQ') == doc.definitions[0]
33+
assert get_operation_ast(doc, 'TestM') == doc.definitions[1]
34+
35+
36+
def test_does_not_get_fragment():
37+
doc = parse('fragment Foo on Type { field }')
38+
assert not get_operation_ast(doc)
39+
assert not get_operation_ast(doc, 'Foo')
40+
41+
42+
def test_does_not_get_fragment_with_same_name_query():
43+
doc = parse('fragment Foo on Type { field } query Foo { field }')
44+
assert get_operation_ast(doc) == doc.definitions[1]
45+
assert get_operation_ast(doc, 'Foo') == doc.definitions[1]
46+

0 commit comments

Comments
 (0)