@@ -431,6 +431,221 @@ 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 ( 'Does not (yet) separately emit 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
+ name : 'Luke' ,
520
+ } ,
521
+ } ,
522
+ path : [ ] ,
523
+ label : 'DeferID' ,
524
+ } ,
525
+ {
526
+ data : {
527
+ hero : {
528
+ id : '1' ,
529
+ name : 'Luke' ,
530
+ } ,
531
+ } ,
532
+ path : [ ] ,
533
+ label : 'DeferName' ,
534
+ } ,
535
+ ] ,
536
+ hasNext : false ,
537
+ } ,
538
+ ] ) ;
539
+ } ) ;
540
+
541
+ it ( 'Does not (yet) separately emit defer fragments with varying subfields of same priorities but different level of defers' , async ( ) => {
542
+ const document = parse ( `
543
+ query HeroNameQuery {
544
+ hero {
545
+ id
546
+ name
547
+ }
548
+ hero {
549
+ ... @defer(label: "DeferID") {
550
+ id
551
+ }
552
+ }
553
+ ... @defer(label: "DeferName") {
554
+ hero {
555
+ name
556
+ }
557
+ }
558
+ }
559
+ ` ) ;
560
+ const result = await complete ( document ) ;
561
+ expectJSON ( result ) . toDeepEqual ( [
562
+ {
563
+ data : {
564
+ hero : {
565
+ id : '1' ,
566
+ name : 'Luke' ,
567
+ } ,
568
+ } ,
569
+ hasNext : true ,
570
+ } ,
571
+ {
572
+ incremental : [
573
+ {
574
+ data : {
575
+ id : '1' ,
576
+ } ,
577
+ path : [ 'hero' ] ,
578
+ label : 'DeferID' ,
579
+ } ,
580
+ {
581
+ data : {
582
+ hero : {
583
+ id : '1' ,
584
+ name : 'Luke' ,
585
+ } ,
586
+ } ,
587
+ path : [ ] ,
588
+ label : 'DeferName' ,
589
+ } ,
590
+ ] ,
591
+ hasNext : false ,
592
+ } ,
593
+ ] ) ;
594
+ } ) ;
595
+
596
+ it ( 'Does not (yet) separately emit nested defer fragments with varying subfields of same priorities but different level of defers' , async ( ) => {
597
+ const document = parse ( `
598
+ query HeroNameQuery {
599
+ hero {
600
+ id
601
+ name
602
+ }
603
+ ... @defer(label: "DeferName") {
604
+ hero {
605
+ name
606
+ ... @defer(label: "DeferID") {
607
+ id
608
+ }
609
+ }
610
+ }
611
+ }
612
+ ` ) ;
613
+ const result = await complete ( document ) ;
614
+ expectJSON ( result ) . toDeepEqual ( [
615
+ {
616
+ data : {
617
+ hero : {
618
+ id : '1' ,
619
+ name : 'Luke' ,
620
+ } ,
621
+ } ,
622
+ hasNext : true ,
623
+ } ,
624
+ {
625
+ incremental : [
626
+ {
627
+ data : {
628
+ id : '1' ,
629
+ } ,
630
+ path : [ 'hero' ] ,
631
+ label : 'DeferID' ,
632
+ } ,
633
+ {
634
+ data : {
635
+ hero : {
636
+ id : '1' ,
637
+ name : 'Luke' ,
638
+ } ,
639
+ } ,
640
+ path : [ ] ,
641
+ label : 'DeferName' ,
642
+ } ,
643
+ ] ,
644
+ hasNext : false ,
645
+ } ,
646
+ ] ) ;
647
+ } ) ;
648
+
434
649
it ( 'Handles errors thrown in deferred fragments' , async ( ) => {
435
650
const document = parse ( `
436
651
query HeroNameQuery {
0 commit comments