2018-08-31 20:41:20 +03:00
|
|
|
import pytest
|
|
|
|
|
|
|
|
from collections import OrderedDict
|
|
|
|
from graphql.execution.executors.asyncio import AsyncioExecutor
|
|
|
|
|
|
|
|
from graphql_relay.utils import base64
|
|
|
|
|
|
|
|
from graphene.types import ObjectType, Schema, String
|
|
|
|
from graphene.relay.connection import Connection, ConnectionField, PageInfo
|
|
|
|
from graphene.relay.node import Node
|
|
|
|
|
|
|
|
letter_chars = ["A", "B", "C", "D", "E"]
|
|
|
|
|
|
|
|
|
|
|
|
class Letter(ObjectType):
|
|
|
|
class Meta:
|
|
|
|
interfaces = (Node,)
|
|
|
|
|
|
|
|
letter = String()
|
|
|
|
|
|
|
|
|
|
|
|
class LetterConnection(Connection):
|
|
|
|
class Meta:
|
|
|
|
node = Letter
|
|
|
|
|
|
|
|
|
|
|
|
class Query(ObjectType):
|
|
|
|
letters = ConnectionField(LetterConnection)
|
|
|
|
connection_letters = ConnectionField(LetterConnection)
|
|
|
|
promise_letters = ConnectionField(LetterConnection)
|
|
|
|
|
|
|
|
node = Node.Field()
|
|
|
|
|
|
|
|
def resolve_letters(self, info, **args):
|
|
|
|
return list(letters.values())
|
|
|
|
|
|
|
|
async def resolve_promise_letters(self, info, **args):
|
|
|
|
return list(letters.values())
|
|
|
|
|
|
|
|
def resolve_connection_letters(self, info, **args):
|
|
|
|
return LetterConnection(
|
|
|
|
page_info=PageInfo(has_next_page=True, has_previous_page=False),
|
|
|
|
edges=[
|
|
|
|
LetterConnection.Edge(node=Letter(id=0, letter="A"), cursor="a-cursor")
|
|
|
|
],
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
schema = Schema(Query)
|
|
|
|
|
|
|
|
letters = OrderedDict()
|
|
|
|
for i, letter in enumerate(letter_chars):
|
|
|
|
letters[letter] = Letter(id=i, letter=letter)
|
|
|
|
|
|
|
|
|
|
|
|
def edges(selected_letters):
|
|
|
|
return [
|
|
|
|
{
|
2021-07-16 18:56:15 +03:00
|
|
|
"node": {"id": base64("Letter:%s" % letter.id), "letter": letter.letter},
|
|
|
|
"cursor": base64("arrayconnection:%s" % letter.id),
|
2018-08-31 20:41:20 +03:00
|
|
|
}
|
2021-07-16 18:56:15 +03:00
|
|
|
for letter in [letters[i] for i in selected_letters]
|
2018-08-31 20:41:20 +03:00
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
def cursor_for(ltr):
|
|
|
|
letter = letters[ltr]
|
|
|
|
return base64("arrayconnection:%s" % letter.id)
|
|
|
|
|
|
|
|
|
|
|
|
def execute(args=""):
|
|
|
|
if args:
|
|
|
|
args = "(" + args + ")"
|
|
|
|
|
|
|
|
return schema.execute(
|
|
|
|
"""
|
|
|
|
{
|
|
|
|
letters%s {
|
|
|
|
edges {
|
|
|
|
node {
|
|
|
|
id
|
|
|
|
letter
|
|
|
|
}
|
|
|
|
cursor
|
|
|
|
}
|
|
|
|
pageInfo {
|
|
|
|
hasPreviousPage
|
|
|
|
hasNextPage
|
|
|
|
startCursor
|
|
|
|
endCursor
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
"""
|
|
|
|
% args
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
|
|
async def test_connection_promise():
|
|
|
|
result = await schema.execute(
|
|
|
|
"""
|
|
|
|
{
|
|
|
|
promiseLetters(first:1) {
|
|
|
|
edges {
|
|
|
|
node {
|
|
|
|
id
|
|
|
|
letter
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pageInfo {
|
|
|
|
hasPreviousPage
|
|
|
|
hasNextPage
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
""",
|
|
|
|
executor=AsyncioExecutor(),
|
|
|
|
return_promise=True,
|
|
|
|
)
|
|
|
|
|
|
|
|
assert not result.errors
|
|
|
|
assert result.data == {
|
|
|
|
"promiseLetters": {
|
|
|
|
"edges": [{"node": {"id": "TGV0dGVyOjA=", "letter": "A"}}],
|
|
|
|
"pageInfo": {"hasPreviousPage": False, "hasNextPage": True},
|
|
|
|
}
|
|
|
|
}
|