-
Notifications
You must be signed in to change notification settings - Fork 180
/
Copy pathtest_base.py
100 lines (74 loc) · 2.91 KB
/
test_base.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import sys
import pytest
import traceback
from promise import Promise
from graphql.error import GraphQLError
from graphql.execution import execute
from graphql.language.parser import parse
from graphql.type import GraphQLField, GraphQLObjectType, GraphQLSchema, GraphQLString
# Necessary for static type checking
if False: # flake8: noqa
from graphql.execution.base import ResolveInfo
from typing import Any
from typing import Optional
def test_raise():
# type: () -> None
ast = parse("query Example { a }")
def resolver(context, *_):
# type: (Optional[Any], *ResolveInfo) -> None
raise GraphQLError("Failed")
Type = GraphQLObjectType(
"Type", {"a": GraphQLField(GraphQLString, resolver=resolver)}
)
result = execute(GraphQLSchema(Type), ast)
assert str(result.errors[0]) == "Failed"
def test_reraise():
# type: () -> None
ast = parse("query Example { a }")
def resolver(context, *_):
# type: (Optional[Any], *ResolveInfo) -> None
raise GraphQLError("Failed")
Type = GraphQLObjectType(
"Type", {"a": GraphQLField(GraphQLString, resolver=resolver)}
)
result = execute(GraphQLSchema(Type), ast)
with pytest.raises(GraphQLError) as exc_info:
result.errors[0].reraise()
extracted = traceback.extract_tb(exc_info.tb)
formatted_tb = [row[2:] for row in extracted]
formatted_tb = [tb for tb in formatted_tb if tb[0] != "reraise"]
assert formatted_tb == [
("test_reraise", "result.errors[0].reraise()"),
(
"resolve_or_error",
"return executor.execute(resolve_fn, source, info, **args)",
),
("execute", "return fn(*args, **kwargs)"),
("resolver", 'raise GraphQLError("Failed")'),
]
assert str(exc_info.value) == "Failed"
@pytest.mark.skipif(sys.version_info < (3,), reason="this works only with Python 3")
def test_reraise_from_promise():
# type: () -> None
ast = parse("query Example { a }")
def fail():
raise GraphQLError("Failed")
def resolver(context, *_):
# type: (Optional[Any], *ResolveInfo) -> None
return Promise(lambda resolve, reject: resolve(fail()))
Type = GraphQLObjectType(
"Type", {"a": GraphQLField(GraphQLString, resolver=resolver)}
)
result = execute(GraphQLSchema(Type), ast)
with pytest.raises(Exception) as exc_info:
result.errors[0].reraise()
extracted = traceback.extract_tb(exc_info.tb)
formatted_tb = [row[2:] for row in extracted]
formatted_tb = [tb for tb in formatted_tb if tb[0] != "reraise"]
assert formatted_tb == [
("test_reraise_from_promise", "result.errors[0].reraise()"),
("_resolve_from_executor", "executor(resolve, reject)"),
("<lambda>", "return Promise(lambda resolve, reject: resolve(fail()))"),
("fail", 'raise GraphQLError("Failed")'),
]
assert str(exc_info.value) == "Failed"