4
4
5
5
from graphene .relay import Node
6
6
7
- from .models import Article , Editor , EmbeddedArticle , Reporter
7
+ from .models import Article , Editor , Player , Reporter
8
8
from .types import (ArticleNode , ArticleType ,
9
9
EditorNode , EditorType ,
10
+ PlayerNode , PlayerType ,
10
11
ReporterNode , ReporterType )
11
12
from ..fields import MongoengineConnectionField
12
13
@@ -25,12 +26,31 @@ def setup_fixtures():
25
26
article1 .save ()
26
27
article2 = Article (headline = 'World' , editor = editor2 )
27
28
article2 .save ()
29
+
28
30
reporter .articles = [article1 , article2 ]
29
31
reporter .save ()
30
32
33
+ player1 = Player (first_name = 'Michael' , last_name = 'Jordan' )
34
+ player1 .save ()
35
+ player2 = Player (first_name = 'Magic' , last_name = 'Johnson' , opponent = player1 )
36
+ player2 .save ()
37
+ player3 = Player (first_name = 'Larry' , last_name = 'Bird' , players = [player1 , player2 ])
38
+ player3 .save ()
39
+
40
+ player1 .players = [player2 ]
41
+ player1 .save ()
42
+
43
+ player2 .players = [player1 ]
44
+ player2 .save ()
45
+
46
+
31
47
setup_fixtures ()
32
48
33
49
50
+ def get_nodes (data , key ):
51
+ return map (lambda edge : edge ['node' ], data [key ]['edges' ])
52
+
53
+
34
54
def test_should_query_editor_well ():
35
55
36
56
class Query (graphene .ObjectType ):
@@ -279,7 +299,10 @@ class Query(graphene.ObjectType):
279
299
articles(headline: "World") {
280
300
edges {
281
301
node {
282
- headline
302
+ headline,
303
+ editor {
304
+ firstName
305
+ }
283
306
}
284
307
}
285
308
}
@@ -290,7 +313,10 @@ class Query(graphene.ObjectType):
290
313
'edges' : [
291
314
{
292
315
'node' : {
293
- 'headline' : 'World'
316
+ 'headline' : 'World' ,
317
+ 'editor' : {
318
+ 'firstName' : 'Grant'
319
+ }
294
320
}
295
321
}
296
322
]
@@ -341,10 +367,8 @@ class Query(graphene.ObjectType):
341
367
schema = graphene .Schema (query = Query )
342
368
result = schema .execute (query )
343
369
344
- def get_nodes (data ):
345
- return map (lambda edge : edge ['node' ], data ['editors' ]['edges' ])
346
-
347
- assert all (item in get_nodes (result .data ) for item in get_nodes (expected ))
370
+ assert not result .errors
371
+ assert all (item in get_nodes (result .data , 'editors' ) for item in get_nodes (expected , 'editors' ))
348
372
349
373
def test_should_custom_kwargs ():
350
374
@@ -383,6 +407,154 @@ def resolve_editors(self, *args, **kwargs):
383
407
assert not result .errors
384
408
assert all (item in result .data ['editors' ] for item in expected ['editors' ])
385
409
410
+
411
+ def test_should_self_reference ():
412
+
413
+ class Query (graphene .ObjectType ):
414
+
415
+ all_players = graphene .List (PlayerType )
416
+
417
+ def resolve_all_players (self , * args , ** kwargs ):
418
+ return Player .objects .all ()
419
+
420
+ query = '''
421
+ query PlayersQuery {
422
+ allPlayers {
423
+ firstName,
424
+ opponent {
425
+ firstName
426
+ },
427
+ players {
428
+ firstName
429
+ }
430
+ }
431
+ }
432
+ '''
433
+ expected = {
434
+ 'allPlayers' : [
435
+ {
436
+ 'firstName' : 'Michael' ,
437
+ 'opponent' : None ,
438
+ 'players' : [
439
+ {
440
+ 'firstName' : 'Magic'
441
+ }
442
+ ]
443
+ },
444
+ {
445
+ 'firstName' : 'Magic' ,
446
+ 'opponent' : {
447
+ 'firstName' : 'Michael'
448
+ },
449
+ 'players' : [
450
+ {
451
+ 'firstName' : 'Michael'
452
+ }
453
+ ]
454
+ },
455
+ {
456
+ 'firstName' : 'Larry' ,
457
+ 'opponent' : None ,
458
+ 'players' : [
459
+ {
460
+ 'firstName' : 'Michael'
461
+ },
462
+ {
463
+ 'firstName' : 'Magic'
464
+ }
465
+ ]
466
+ }
467
+ ]
468
+ }
469
+ schema = graphene .Schema (query = Query )
470
+ result = schema .execute (query )
471
+ assert not result .errors
472
+ assert json .dumps (result .data , sort_keys = True ) == json .dumps (expected , sort_keys = True )
473
+
474
+
475
+ def test_should_node_self_reference ():
476
+
477
+ class Query (graphene .ObjectType ):
478
+
479
+ all_players = MongoengineConnectionField (PlayerNode )
480
+
481
+ query = '''
482
+ query PlayersQuery {
483
+ allPlayers {
484
+ edges {
485
+ node {
486
+ firstName,
487
+ players {
488
+ edges {
489
+ node {
490
+ firstName
491
+ }
492
+ }
493
+ }
494
+ }
495
+ }
496
+ }
497
+ }
498
+ '''
499
+ expected = {
500
+ 'allPlayers' : {
501
+ 'edges' : [
502
+ {
503
+ 'node' : {
504
+ 'firstName' : 'Michael' ,
505
+ 'players' : {
506
+ 'edges' : [
507
+ {
508
+ 'node' : {
509
+ 'firstName' : 'Magic'
510
+ }
511
+ }
512
+ ]
513
+ }
514
+ }
515
+ },
516
+ {
517
+ 'node' : {
518
+ 'firstName' : 'Magic' ,
519
+ 'players' : {
520
+ 'edges' : [
521
+ {
522
+ 'node' : {
523
+ 'firstName' : 'Michael'
524
+ }
525
+ }
526
+ ]
527
+ }
528
+ }
529
+ },
530
+ {
531
+ 'node' : {
532
+ 'firstName' : 'Larry' ,
533
+ 'players' : {
534
+ 'edges' : [
535
+ {
536
+ 'node' : {
537
+ 'firstName' : 'Michael'
538
+ }
539
+ },
540
+ {
541
+ 'node' : {
542
+ 'firstName' : 'Magic'
543
+ }
544
+ }
545
+ ]
546
+ }
547
+ }
548
+ }
549
+ ]
550
+ }
551
+ }
552
+ schema = graphene .Schema (query = Query )
553
+ result = schema .execute (query )
554
+ assert not result .errors
555
+ assert json .dumps (result .data , sort_keys = True ) == json .dumps (expected , sort_keys = True )
556
+
557
+
386
558
# TODO:
387
559
def test_should_paging ():
388
560
pass
0 commit comments