|
| 1 | +from collections import OrderedDict |
1 | 2 | from graphql.core.error import format_error
|
2 | 3 | from graphql.core.execution import Executor
|
3 | 4 | from graphql.core.execution.middlewares.sync import SynchronousExecutionMiddleware
|
@@ -233,3 +234,36 @@ def promise(self):
|
233 | 234 | assert not isinstance(result, Deferred)
|
234 | 235 | assert result.data == {"promise": 'I should work'}
|
235 | 236 | assert not result.errors
|
| 237 | + |
| 238 | + |
| 239 | +def test_executor_can_enforce_strict_ordering(): |
| 240 | + Type = GraphQLObjectType('Type', lambda: { |
| 241 | + 'a': GraphQLField(GraphQLString, |
| 242 | + resolver=lambda *_: succeed('Apple')), |
| 243 | + 'b': GraphQLField(GraphQLString, |
| 244 | + resolver=lambda *_: succeed('Banana')), |
| 245 | + 'c': GraphQLField(GraphQLString, |
| 246 | + resolver=lambda *_: succeed('Cherry')), |
| 247 | + 'deep': GraphQLField(Type, resolver=lambda *_: succeed({})), |
| 248 | + }) |
| 249 | + schema = GraphQLSchema(query=Type) |
| 250 | + executor = Executor(map_type=OrderedDict) |
| 251 | + |
| 252 | + query = '{ a b c aa: c cc: c bb: b aaz: a bbz: b deep { b a c deeper: deep { c a b } } ' \ |
| 253 | + 'ccz: c zzz: c aaa: a }' |
| 254 | + |
| 255 | + def handle_results(result): |
| 256 | + assert not result.errors |
| 257 | + |
| 258 | + data = result.data |
| 259 | + assert isinstance(data, OrderedDict) |
| 260 | + assert list(data.keys()) == ['a', 'b', 'c', 'aa', 'cc', 'bb', 'aaz', 'bbz', 'deep', 'ccz', 'zzz', 'aaa'] |
| 261 | + deep = data['deep'] |
| 262 | + assert isinstance(deep, OrderedDict) |
| 263 | + assert list(deep.keys()) == ['b', 'a', 'c', 'deeper'] |
| 264 | + deeper = deep['deeper'] |
| 265 | + assert isinstance(deeper, OrderedDict) |
| 266 | + assert list(deeper.keys()) == ['c', 'a', 'b'] |
| 267 | + |
| 268 | + raise_callback_results(executor.execute(schema, query), handle_results) |
| 269 | + raise_callback_results(executor.execute(schema, query, execute_serially=True), handle_results) |
0 commit comments