|
8 | 8 | from ..registry import reset_global_registry
|
9 | 9 | from ..fields import SQLAlchemyConnectionField
|
10 | 10 | from ..types import SQLAlchemyObjectType
|
| 11 | +from ..utils import sort_argument_for_model, sort_enum_for_model |
11 | 12 | from .models import Article, Base, Editor, Pet, Reporter
|
12 | 13 |
|
13 | 14 | db = create_engine('sqlite:///test_sqlalchemy.sqlite3')
|
@@ -365,3 +366,147 @@ class Mutation(graphene.ObjectType):
|
365 | 366 | result = schema.execute(query, context_value={'session': session})
|
366 | 367 | assert not result.errors
|
367 | 368 | 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']) |
0 commit comments