@@ -311,17 +311,17 @@ describe('Execute: defer directive', () => {
311
311
incremental : [
312
312
{
313
313
data : {
314
- friends : [ { name : 'Han' } , { name : 'Leia' } , { name : 'C-3PO' } ] ,
314
+ name : 'Luke' ,
315
315
} ,
316
316
path : [ 'hero' ] ,
317
- label : 'DeferNested ' ,
317
+ label : 'DeferTop ' ,
318
318
} ,
319
319
{
320
320
data : {
321
- name : 'Luke' ,
321
+ friends : [ { name : 'Han' } , { name : 'Leia' } , { name : 'C-3PO' } ] ,
322
322
} ,
323
323
path : [ 'hero' ] ,
324
- label : 'DeferTop ' ,
324
+ label : 'DeferNested ' ,
325
325
} ,
326
326
] ,
327
327
hasNext : false ,
@@ -431,6 +431,217 @@ describe('Execute: defer directive', () => {
431
431
} ,
432
432
] ) ;
433
433
} ) ;
434
+
435
+ it ( 'Can separately emit defer fragments with different labels with varying fields' , async ( ) => {
436
+ const document = parse ( `
437
+ query HeroNameQuery {
438
+ hero {
439
+ id
440
+ name
441
+ ... @defer(label: "DeferID") {
442
+ id
443
+ }
444
+ ... @defer(label: "DeferName") {
445
+ name
446
+ }
447
+ }
448
+ }
449
+ ` ) ;
450
+ const result = await complete ( document ) ;
451
+ expectJSON ( result ) . toDeepEqual ( [
452
+ {
453
+ data : {
454
+ hero : {
455
+ id : '1' ,
456
+ name : 'Luke' ,
457
+ } ,
458
+ } ,
459
+ hasNext : true ,
460
+ } ,
461
+ {
462
+ incremental : [
463
+ {
464
+ data : {
465
+ id : '1' ,
466
+ } ,
467
+ path : [ 'hero' ] ,
468
+ label : 'DeferID' ,
469
+ } ,
470
+ {
471
+ data : {
472
+ name : 'Luke' ,
473
+ } ,
474
+ path : [ 'hero' ] ,
475
+ label : 'DeferName' ,
476
+ } ,
477
+ ] ,
478
+ hasNext : false ,
479
+ } ,
480
+ ] ) ;
481
+ } ) ;
482
+
483
+ it ( 'Separately emits defer fragments with different labels with varying subfields' , async ( ) => {
484
+ const document = parse ( `
485
+ query HeroNameQuery {
486
+ hero {
487
+ id
488
+ name
489
+ }
490
+ ... @defer(label: "DeferID") {
491
+ hero {
492
+ id
493
+ }
494
+ }
495
+ ... @defer(label: "DeferName") {
496
+ hero {
497
+ name
498
+ }
499
+ }
500
+ }
501
+ ` ) ;
502
+ const result = await complete ( document ) ;
503
+ expectJSON ( result ) . toDeepEqual ( [
504
+ {
505
+ data : {
506
+ hero : {
507
+ id : '1' ,
508
+ name : 'Luke' ,
509
+ } ,
510
+ } ,
511
+ hasNext : true ,
512
+ } ,
513
+ {
514
+ incremental : [
515
+ {
516
+ data : {
517
+ hero : {
518
+ id : '1' ,
519
+ } ,
520
+ } ,
521
+ path : [ ] ,
522
+ label : 'DeferID' ,
523
+ } ,
524
+ {
525
+ data : {
526
+ hero : {
527
+ name : 'Luke' ,
528
+ } ,
529
+ } ,
530
+ path : [ ] ,
531
+ label : 'DeferName' ,
532
+ } ,
533
+ ] ,
534
+ hasNext : false ,
535
+ } ,
536
+ ] ) ;
537
+ } ) ;
538
+
539
+ it ( 'Separately emits defer fragments with varying subfields of same priorities but different level of defers' , async ( ) => {
540
+ const document = parse ( `
541
+ query HeroNameQuery {
542
+ hero {
543
+ id
544
+ name
545
+ }
546
+ hero {
547
+ ... @defer(label: "DeferID") {
548
+ id
549
+ }
550
+ }
551
+ ... @defer(label: "DeferName") {
552
+ hero {
553
+ name
554
+ }
555
+ }
556
+ }
557
+ ` ) ;
558
+ const result = await complete ( document ) ;
559
+ expectJSON ( result ) . toDeepEqual ( [
560
+ {
561
+ data : {
562
+ hero : {
563
+ id : '1' ,
564
+ name : 'Luke' ,
565
+ } ,
566
+ } ,
567
+ hasNext : true ,
568
+ } ,
569
+ {
570
+ incremental : [
571
+ {
572
+ data : {
573
+ id : '1' ,
574
+ } ,
575
+ path : [ 'hero' ] ,
576
+ label : 'DeferID' ,
577
+ } ,
578
+ {
579
+ data : {
580
+ hero : {
581
+ name : 'Luke' ,
582
+ } ,
583
+ } ,
584
+ path : [ ] ,
585
+ label : 'DeferName' ,
586
+ } ,
587
+ ] ,
588
+ hasNext : false ,
589
+ } ,
590
+ ] ) ;
591
+ } ) ;
592
+
593
+ it ( 'Separately emits nested defer fragments with varying subfields of same priorities but different level of defers' , async ( ) => {
594
+ const document = parse ( `
595
+ query HeroNameQuery {
596
+ hero {
597
+ id
598
+ name
599
+ }
600
+ ... @defer(label: "DeferName") {
601
+ hero {
602
+ name
603
+ ... @defer(label: "DeferID") {
604
+ id
605
+ }
606
+ }
607
+ }
608
+ }
609
+ ` ) ;
610
+ const result = await complete ( document ) ;
611
+ expectJSON ( result ) . toDeepEqual ( [
612
+ {
613
+ data : {
614
+ hero : {
615
+ id : '1' ,
616
+ name : 'Luke' ,
617
+ } ,
618
+ } ,
619
+ hasNext : true ,
620
+ } ,
621
+ {
622
+ incremental : [
623
+ {
624
+ data : {
625
+ id : '1' ,
626
+ } ,
627
+ path : [ 'hero' ] ,
628
+ label : 'DeferID' ,
629
+ } ,
630
+ {
631
+ data : {
632
+ hero : {
633
+ name : 'Luke' ,
634
+ } ,
635
+ } ,
636
+ path : [ ] ,
637
+ label : 'DeferName' ,
638
+ } ,
639
+ ] ,
640
+ hasNext : false ,
641
+ } ,
642
+ ] ) ;
643
+ } ) ;
644
+
434
645
it ( 'Handles errors thrown in deferred fragments' , async ( ) => {
435
646
const document = parse ( `
436
647
query HeroNameQuery {
@@ -605,11 +816,6 @@ describe('Execute: defer directive', () => {
605
816
data : { slowField : 'slow' , friends : [ { } , { } , { } ] } ,
606
817
path : [ 'hero' ] ,
607
818
} ,
608
- ] ,
609
- hasNext : true ,
610
- } ,
611
- {
612
- incremental : [
613
819
{ data : { name : 'Han' } , path : [ 'hero' , 'friends' , 0 ] } ,
614
820
{ data : { name : 'Leia' } , path : [ 'hero' , 'friends' , 1 ] } ,
615
821
{ data : { name : 'C-3PO' } , path : [ 'hero' , 'friends' , 2 ] } ,
0 commit comments