|
| 1 | +import sys |
| 2 | + |
1 | 3 | import pytest
|
2 | 4 | import traceback
|
3 | 5 |
|
| 6 | +from promise import Promise |
| 7 | + |
4 | 8 | from graphql.execution import execute
|
5 | 9 | from graphql.language.parser import parse
|
6 | 10 | from graphql.type import GraphQLField, GraphQLObjectType, GraphQLSchema, GraphQLString
|
@@ -46,28 +50,52 @@ def resolver(context, *_):
|
46 | 50 |
|
47 | 51 | extracted = traceback.extract_tb(exc_info.tb)
|
48 | 52 | formatted_tb = [row[2:] for row in extracted]
|
49 |
| - if formatted_tb[2][0] == "reraise": |
50 |
| - formatted_tb[2:] = formatted_tb[3:] |
| 53 | + formatted_tb = [tb for tb in formatted_tb if tb[0] != "reraise"] |
51 | 54 |
|
52 | 55 | assert formatted_tb == [
|
53 | 56 | ("test_reraise", "result.errors[0].reraise()"),
|
54 |
| - ("reraise", "six.reraise(type(self), self, self.stack)"), |
55 |
| - # ('reraise', 'raise value.with_traceback(tb)'), |
56 | 57 | (
|
57 | 58 | "resolve_or_error",
|
58 | 59 | "return executor.execute(resolve_fn, source, info, **args)",
|
59 | 60 | ),
|
60 | 61 | ("execute", "return fn(*args, **kwargs)"),
|
61 | 62 | ("resolver", 'raise Exception("Failed")'),
|
62 | 63 | ]
|
63 |
| - # assert formatted_tb == [ |
64 |
| - # ('test_reraise', 'result.errors[0].reraise()'), |
65 |
| - # ('reraise', 'six.reraise(type(self), self, self.stack)'), |
66 |
| - # ('on_complete_resolver', 'result = __resolver(*args, **kwargs)'), |
67 |
| - # # ('reraise', 'raise value.with_traceback(tb)'), |
68 |
| - # # ('resolve_or_error', 'return executor.execute(resolve_fn, source, info, **args)'), |
69 |
| - # # ('execute', 'return fn(*args, **kwargs)'), |
70 |
| - # ('resolver', "raise Exception('Failed')") |
71 |
| - # ] |
| 64 | + |
| 65 | + assert str(exc_info.value) == "Failed" |
| 66 | + |
| 67 | + |
| 68 | +@pytest.mark.skipif(sys.version_info < (3,), reason="this works only with Python 3") |
| 69 | +def test_reraise_from_promise(): |
| 70 | + # type: () -> None |
| 71 | + ast = parse("query Example { a }") |
| 72 | + |
| 73 | + def fail(): |
| 74 | + raise Exception("Failed") |
| 75 | + |
| 76 | + def resolver(context, *_): |
| 77 | + # type: (Optional[Any], *ResolveInfo) -> None |
| 78 | + return Promise(lambda resolve, reject: resolve(fail())) |
| 79 | + |
| 80 | + Type = GraphQLObjectType( |
| 81 | + "Type", {"a": GraphQLField(GraphQLString, resolver=resolver)} |
| 82 | + ) |
| 83 | + |
| 84 | + result = execute(GraphQLSchema(Type), ast) |
| 85 | + with pytest.raises(Exception) as exc_info: |
| 86 | + result.errors[0].reraise() |
| 87 | + |
| 88 | + extracted = traceback.extract_tb(exc_info.tb) |
| 89 | + formatted_tb = [row[2:] for row in extracted] |
| 90 | + formatted_tb = [tb for tb in formatted_tb if tb[0] != "reraise"] |
| 91 | + |
| 92 | + print(formatted_tb) |
| 93 | + |
| 94 | + assert formatted_tb == [ |
| 95 | + ("test_reraise_from_promise", "result.errors[0].reraise()"), |
| 96 | + ("_resolve_from_executor", "executor(resolve, reject)"), |
| 97 | + ("<lambda>", "return Promise(lambda resolve, reject: resolve(fail()))"), |
| 98 | + ("fail", 'raise Exception("Failed")'), |
| 99 | + ] |
72 | 100 |
|
73 | 101 | assert str(exc_info.value) == "Failed"
|
0 commit comments