Skip to content

Commit db0e3db

Browse files
committed
Add tests of the sort argument
1 parent 442b94b commit db0e3db

File tree

3 files changed

+223
-2
lines changed

3 files changed

+223
-2
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from ..fields import SQLAlchemyConnectionField
2+
from ..types import SQLAlchemyObjectType
3+
from ..utils import sort_argument_for_model
4+
from .models import Pet as PetModel, Editor
5+
6+
7+
class Pet(SQLAlchemyObjectType):
8+
class Meta:
9+
model = PetModel
10+
11+
12+
def test_sort_added_by_default():
13+
arg = SQLAlchemyConnectionField(Pet)
14+
assert 'sort' in arg.args
15+
assert arg.args['sort'] == sort_argument_for_model(PetModel)
16+
17+
18+
def test_sort_can_be_removed():
19+
arg = SQLAlchemyConnectionField(Pet, sort=None)
20+
assert 'sort' not in arg.args
21+
22+
23+
def test_custom_sort():
24+
arg = SQLAlchemyConnectionField(Pet, sort=sort_argument_for_model(Editor))
25+
assert arg.args['sort'] == sort_argument_for_model(Editor)

graphene_sqlalchemy/tests/test_query.py

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from ..registry import reset_global_registry
99
from ..fields import SQLAlchemyConnectionField
1010
from ..types import SQLAlchemyObjectType
11+
from ..utils import sort_argument_for_model, sort_enum_for_model
1112
from .models import Article, Base, Editor, Pet, Reporter
1213

1314
db = create_engine('sqlite:///test_sqlalchemy.sqlite3')
@@ -365,3 +366,147 @@ class Mutation(graphene.ObjectType):
365366
result = schema.execute(query, context_value={'session': session})
366367
assert not result.errors
367368
assert result.data == expected
369+
370+
371+
def sort_setup(session):
372+
pets = [
373+
Pet(id=2, name='Lassie', pet_kind='dog'),
374+
Pet(id=22, name='Alf', pet_kind='cat'),
375+
Pet(id=3, name='Barf', pet_kind='dog')
376+
]
377+
session.add_all(pets)
378+
session.commit()
379+
380+
381+
def test_sort(session):
382+
sort_setup(session)
383+
384+
class PetNode(SQLAlchemyObjectType):
385+
class Meta:
386+
model = Pet
387+
interfaces = (Node, )
388+
389+
class Query(graphene.ObjectType):
390+
defaultSort = SQLAlchemyConnectionField(PetNode)
391+
nameSort = SQLAlchemyConnectionField(PetNode)
392+
multipleSort = SQLAlchemyConnectionField(PetNode)
393+
descSort = SQLAlchemyConnectionField(PetNode)
394+
singleColumnSort = SQLAlchemyConnectionField(
395+
PetNode, sort=graphene.Argument(sort_enum_for_model(Pet)))
396+
noDefaultSort = SQLAlchemyConnectionField(
397+
PetNode, sort=sort_argument_for_model(Pet, False))
398+
noSort = SQLAlchemyConnectionField(PetNode, sort=None)
399+
400+
query = '''
401+
query sortTest {
402+
defaultSort{
403+
edges{
404+
node{
405+
id
406+
}
407+
}
408+
}
409+
nameSort(sort: name_asc){
410+
edges{
411+
node{
412+
name
413+
}
414+
}
415+
}
416+
multipleSort(sort: [pet_kind_asc, name_desc]){
417+
edges{
418+
node{
419+
name
420+
petKind
421+
}
422+
}
423+
}
424+
descSort(sort: [name_desc]){
425+
edges{
426+
node{
427+
name
428+
}
429+
}
430+
}
431+
singleColumnSort(sort: name_desc){
432+
edges{
433+
node{
434+
name
435+
}
436+
}
437+
}
438+
noDefaultSort(sort: name_asc){
439+
edges{
440+
node{
441+
name
442+
}
443+
}
444+
}
445+
}
446+
'''
447+
448+
def makeNodes(nodeList):
449+
nodes = [{'node': item} for item in nodeList]
450+
return {'edges': nodes}
451+
452+
expected = {
453+
'defaultSort': makeNodes([{'id': 'UGV0Tm9kZToy'}, {'id': 'UGV0Tm9kZToz'}, {'id': 'UGV0Tm9kZToyMg=='}]),
454+
'nameSort': makeNodes([{'name': 'Alf'}, {'name': 'Barf'}, {'name': 'Lassie'}]),
455+
'noDefaultSort': makeNodes([{'name': 'Alf'}, {'name': 'Barf'}, {'name': 'Lassie'}]),
456+
'multipleSort': makeNodes([
457+
{'name': 'Alf', 'petKind': 'cat'},
458+
{'name': 'Lassie', 'petKind': 'dog'},
459+
{'name': 'Barf', 'petKind': 'dog'}
460+
]),
461+
'descSort': makeNodes([{'name': 'Lassie'}, {'name': 'Barf'}, {'name': 'Alf'}]),
462+
'singleColumnSort': makeNodes([{'name': 'Lassie'}, {'name': 'Barf'}, {'name': 'Alf'}]),
463+
} # yapf: disable
464+
465+
schema = graphene.Schema(query=Query)
466+
result = schema.execute(query, context_value={'session': session})
467+
assert not result.errors
468+
assert result.data == expected
469+
470+
queryError = '''
471+
query sortTest {
472+
singleColumnSort(sort: [pet_kind_asc, name_desc]){
473+
edges{
474+
node{
475+
name
476+
}
477+
}
478+
}
479+
}
480+
'''
481+
result = schema.execute(queryError, context_value={'session': session})
482+
assert result.errors is not None
483+
484+
queryNoSort = '''
485+
query sortTest {
486+
noDefaultSort{
487+
edges{
488+
node{
489+
name
490+
}
491+
}
492+
}
493+
noSort{
494+
edges{
495+
node{
496+
name
497+
}
498+
}
499+
}
500+
}
501+
'''
502+
503+
expectedNoSort = {
504+
'noDefaultSort': makeNodes([{'name': 'Alf'}, {'name': 'Barf'}, {'name': 'Lassie'}]),
505+
'noSort': makeNodes([{'name': 'Alf'}, {'name': 'Barf'}, {'name': 'Lassie'}]),
506+
} # yapf: disable
507+
508+
result = schema.execute(queryNoSort, context_value={'session': session})
509+
assert not result.errors
510+
for key, value in result.data.items():
511+
assert set(node['node']['name'] for node in value['edges']) == set(
512+
node['node']['name'] for node in expectedNoSort[key]['edges'])

graphene_sqlalchemy/tests/test_utils.py

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
from graphene import ObjectType, Schema, String
1+
from graphene import Enum, List, ObjectType, Schema, String
2+
import sqlalchemy as sa
23

3-
from ..utils import get_session
4+
from ..utils import get_session, sort_enum_for_model, sort_argument_for_model
5+
from .models import Pet, Editor
46

57

68
def test_get_session():
@@ -22,3 +24,52 @@ def resolve_x(self, info):
2224
result = schema.execute(query, context_value={'session': session})
2325
assert not result.errors
2426
assert result.data['x'] == session
27+
28+
29+
def test_sort_enum_for_model():
30+
enum = sort_enum_for_model(Pet)
31+
assert isinstance(enum, type(Enum))
32+
assert str(enum) == 'PetSortEnum'
33+
for col in sa.inspect(Pet).columns:
34+
assert hasattr(enum, col.name + '_asc')
35+
assert hasattr(enum, col.name + '_desc')
36+
37+
38+
def test_sort_enum_for_model_custom_naming():
39+
enum = sort_enum_for_model(Pet, 'Foo',
40+
lambda n, d: n.upper() + ('A' if d else 'D'))
41+
assert str(enum) == 'Foo'
42+
for col in sa.inspect(Pet).columns:
43+
assert hasattr(enum, col.name.upper() + 'A')
44+
assert hasattr(enum, col.name.upper() + 'D')
45+
46+
47+
def test_enum_cache():
48+
assert sort_enum_for_model(Editor) is sort_enum_for_model(Editor)
49+
50+
51+
def test_sort_argument_for_model():
52+
arg = sort_argument_for_model(Pet)
53+
54+
assert isinstance(arg.type, List)
55+
assert arg.default_value == [Pet.id.name + '_asc']
56+
assert arg.type.of_type == sort_enum_for_model(Pet)
57+
58+
59+
def test_sort_argument_for_model_no_default():
60+
arg = sort_argument_for_model(Pet, False)
61+
62+
assert arg.default_value is None
63+
64+
65+
def test_sort_argument_for_model_multiple_pk():
66+
Base = sa.ext.declarative.declarative_base()
67+
68+
class MultiplePK(Base):
69+
foo = sa.Column(sa.Integer, primary_key=True)
70+
bar = sa.Column(sa.Integer, primary_key=True)
71+
__tablename__ = 'MultiplePK'
72+
73+
arg = sort_argument_for_model(MultiplePK)
74+
assert set(arg.default_value) == set((MultiplePK.foo.name + '_asc',
75+
MultiplePK.bar.name + '_asc'))

0 commit comments

Comments
 (0)