Skip to content

Commit c792923

Browse files
committed
Added ability to return a Connection instance in the connection resolver
1 parent ad953f0 commit c792923

File tree

2 files changed

+66
-10
lines changed

2 files changed

+66
-10
lines changed

graphene/relay/connection.py

+12-8
Original file line numberDiff line numberDiff line change
@@ -117,21 +117,25 @@ def type(self):
117117
).format(str(self), connection_type)
118118
return connection_type
119119

120-
@staticmethod
121-
def connection_resolver(resolver, connection, root, args, context, info):
122-
iterable = resolver(root, args, context, info)
123-
assert isinstance(iterable, Iterable), (
124-
'Resolved value from the connection field have to be iterable. '
120+
@classmethod
121+
def connection_resolver(cls, resolver, connection, root, args, context, info):
122+
resolved = resolver(root, args, context, info)
123+
124+
if isinstance(resolved, connection):
125+
return resolved
126+
127+
assert isinstance(resolved, Iterable), (
128+
'Resolved value from the connection field have to be iterable or instance of {}. '
125129
'Received "{}"'
126-
).format(iterable)
130+
).format(connection, resolved)
127131
connection = connection_from_list(
128-
iterable,
132+
resolved,
129133
args,
130134
connection_type=connection,
131135
edge_type=connection.Edge,
132136
pageinfo_type=PageInfo
133137
)
134-
connection.iterable = iterable
138+
connection.iterable = resolved
135139
return connection
136140

137141
def get_resolver(self, parent_resolver):

graphene/relay/tests/test_connection_query.py

+54-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from graphql_relay.utils import base64
44

55
from ...types import ObjectType, Schema, String
6-
from ..connection import ConnectionField
6+
from ..connection import ConnectionField, PageInfo
77
from ..node import Node
88

99
letter_chars = ['A', 'B', 'C', 'D', 'E']
@@ -19,11 +19,26 @@ class Meta:
1919

2020
class Query(ObjectType):
2121
letters = ConnectionField(Letter)
22+
connection_letters = ConnectionField(Letter)
23+
24+
node = Node.Field()
2225

2326
def resolve_letters(self, args, context, info):
2427
return list(letters.values())
2528

26-
node = Node.Field()
29+
def resolve_connection_letters(self, args, context, info):
30+
return Letter.Connection(
31+
page_info=PageInfo(
32+
has_next_page=True,
33+
has_previous_page=False
34+
),
35+
edges=[
36+
Letter.Connection.Edge(
37+
node=Letter(id=0, letter='A'),
38+
cursor='a-cursor'
39+
),
40+
]
41+
)
2742

2843

2944
schema = Schema(Query)
@@ -176,3 +191,40 @@ def test_returns_all_elements_if_cursors_are_on_the_outside():
176191

177192
def test_returns_no_elements_if_cursors_cross():
178193
check('before: "{}" after: "{}"'.format(base64('arrayconnection:%s' % 2), base64('arrayconnection:%s' % 4)), '')
194+
195+
196+
def test_connection_type_nodes():
197+
result = schema.execute('''
198+
{
199+
connectionLetters {
200+
edges {
201+
node {
202+
id
203+
letter
204+
}
205+
cursor
206+
}
207+
pageInfo {
208+
hasPreviousPage
209+
hasNextPage
210+
}
211+
}
212+
}
213+
''')
214+
215+
assert not result.errors
216+
assert result.data == {
217+
'connectionLetters': {
218+
'edges': [{
219+
'node': {
220+
'id': 'TGV0dGVyOjA=',
221+
'letter': 'A',
222+
},
223+
'cursor': 'a-cursor',
224+
}],
225+
'pageInfo': {
226+
'hasPreviousPage': False,
227+
'hasNextPage': True,
228+
}
229+
}
230+
}

0 commit comments

Comments
 (0)