@@ -142,7 +142,7 @@ class Schema < GraphQL::Schema
142
142
GRAPHQL
143
143
}
144
144
145
- it "finds fields on object types and interface types" do
145
+ it "enumerates fields on object types and interface types" do
146
146
node_lookahead = query . lookahead . selection ( "node" )
147
147
assert_equal [ :id , :name , :latin_name ] , node_lookahead . selections . map ( &:name )
148
148
end
@@ -243,9 +243,9 @@ class Schema < GraphQL::Schema
243
243
244
244
it "finds selections using merging" do
245
245
merged_lookahead = query . lookahead . selection ( :find_bird_species ) . selection ( :similar_species )
246
- assert merged_lookahead . selects? ( :__typename )
247
- assert merged_lookahead . selects? ( :is_waterfowl )
248
- assert merged_lookahead . selects? ( :name )
246
+ assert_equal true , merged_lookahead . selects? ( :__typename )
247
+ assert_equal true , merged_lookahead . selects? ( :is_waterfowl )
248
+ assert_equal true , merged_lookahead . selects? ( :name )
249
249
end
250
250
end
251
251
end
@@ -279,7 +279,7 @@ class Schema < GraphQL::Schema
279
279
it "works for invalid queries" do
280
280
context = { lookahead_latin_name : 0 }
281
281
res = LookaheadTest ::Schema . execute ( "{ doesNotExist }" , context : context )
282
- assert res . key? ( "errors" )
282
+ assert_equal true , res . key? ( "errors" )
283
283
assert_equal 0 , context [ :lookahead_latin_name ]
284
284
end
285
285
end
@@ -413,4 +413,174 @@ def query(doc = document)
413
413
assert_equal false , lookahead . selects? ( :name )
414
414
end
415
415
end
416
+
417
+ describe '#selects?' do
418
+ let ( :document ) {
419
+ GraphQL . parse <<-GRAPHQL
420
+ query {
421
+ findBirdSpecies(byName: "Laughing Gull") {
422
+ name
423
+ similarSpecies {
424
+ likesWater: isWaterfowl
425
+ }
426
+ }
427
+ }
428
+ GRAPHQL
429
+ }
430
+
431
+ def query ( doc = document )
432
+ GraphQL ::Query . new ( LookaheadTest ::Schema , document : doc )
433
+ end
434
+
435
+ it "returns true for each field that is selected" do
436
+ ast_node = document . definitions . first . selections . first
437
+ field = LookaheadTest ::Query . fields [ "findBirdSpecies" ]
438
+ lookahead = GraphQL ::Execution ::Lookahead . new ( query : query , ast_nodes : [ ast_node ] , field : field )
439
+ assert_equal true , lookahead . selects? ( :name )
440
+ assert_equal true , lookahead . selects? ( :similar_species )
441
+ end
442
+
443
+ it "returns false for a selection which does not match arguments" do
444
+ ast_node = document . definitions . first
445
+ lookahead = GraphQL ::Execution ::Lookahead . new ( query : query , ast_nodes : [ ast_node ] , root_type : LookaheadTest ::Query )
446
+ arguments = { by_name : "Cardinal" }
447
+
448
+ assert_equal false , lookahead . selects? ( :name , arguments : arguments )
449
+ end
450
+
451
+ it "returns true for a selection which matches arguments" do
452
+ ast_node = document . definitions . first
453
+ lookahead = GraphQL ::Execution ::Lookahead . new ( query : query , ast_nodes : [ ast_node ] , root_type : LookaheadTest ::Query )
454
+ arguments = { by_name : "Laughing Gull" }
455
+
456
+ assert_equal true , lookahead . selects? ( :find_bird_species , arguments : arguments )
457
+ end
458
+
459
+ it 'returns true for selection that is duplicated across fragments' do
460
+ doc = GraphQL . parse <<-GRAPHQL
461
+ query {
462
+ ... on Query {
463
+ ...MoreFields
464
+ }
465
+ }
466
+
467
+ fragment MoreFields on Query {
468
+ findBirdSpecies(byName: "Laughing Gull") {
469
+ name
470
+ }
471
+ findBirdSpecies(byName: "Laughing Gull") {
472
+ ...EvenMoreFields
473
+ }
474
+ }
475
+
476
+ fragment EvenMoreFields on BirdSpecies {
477
+ similarSpecies {
478
+ likesWater: isWaterfowl
479
+ }
480
+ }
481
+ GRAPHQL
482
+
483
+ lookahead = query ( doc ) . lookahead
484
+ assert_equal true , lookahead . selects? ( :find_bird_species )
485
+
486
+ assert_equal true , lookahead . selection ( :find_bird_species ) . selects? ( :name )
487
+ assert_equal true , lookahead . selection ( :find_bird_species ) . selects? ( :similar_species )
488
+ end
489
+
490
+ it "returns true for the same field name on distinct types" do
491
+ query = GraphQL ::Query . new ( LookaheadTest ::Schema , <<-GRAPHQL )
492
+ query {
493
+ node(id: "Cardinal") {
494
+ ... on BirdSpecies {
495
+ name
496
+ }
497
+ ... on BirdGenus {
498
+ name
499
+ }
500
+ id
501
+ }
502
+ }
503
+ GRAPHQL
504
+
505
+ node_lookahead = query . lookahead . selection ( "node" )
506
+ assert_equal true , node_lookahead . selects? ( :id )
507
+ assert_equal true , node_lookahead . selects? ( :name )
508
+ end
509
+
510
+ it "returns false on missing selections" do
511
+ ast_node = document . definitions . first . selections . first
512
+ field = LookaheadTest ::Query . fields [ "findBirdSpecies" ]
513
+ lookahead = GraphQL ::Execution ::Lookahead . new ( query : query , ast_nodes : [ ast_node ] , field : field )
514
+ assert_equal false , lookahead . selection ( :genus ) . selects? ( :name )
515
+ end
516
+
517
+ it "returns true for fields enabled by directives" do
518
+ document = GraphQL . parse <<-GRAPHQL
519
+ query($skipName: Boolean!, $includeGenus: Boolean!){
520
+ findBirdSpecies(byName: "Cardinal") {
521
+ id
522
+ name @skip(if: $skipName)
523
+ genus @include(if: $includeGenus)
524
+ }
525
+ }
526
+ GRAPHQL
527
+ query = GraphQL ::Query . new ( LookaheadTest ::Schema , document : document ,
528
+ variables : { skipName : false , includeGenus : true } )
529
+ lookahead = query . lookahead . selection ( "findBirdSpecies" )
530
+ assert_equal true , lookahead . selects? ( :name )
531
+ assert_equal true , lookahead . selects? ( :genus )
532
+ end
533
+
534
+ it "returns false for fields disabled by directive" do
535
+ document = GraphQL . parse <<-GRAPHQL
536
+ query($skipName: Boolean!, $includeGenus: Boolean!){
537
+ findBirdSpecies(byName: "Cardinal") {
538
+ id
539
+ name @skip(if: $skipName)
540
+ genus @include(if: $includeGenus)
541
+ }
542
+ }
543
+ GRAPHQL
544
+ query = GraphQL ::Query . new ( LookaheadTest ::Schema , document : document ,
545
+ variables : { skipName : true , includeGenus : false } )
546
+ lookahead = query . lookahead . selection ( "findBirdSpecies" )
547
+ assert_equal true , lookahead . selects? ( :id )
548
+ assert_equal false , lookahead . selects? ( :name )
549
+ assert_equal false , lookahead . selects? ( :genus )
550
+ end
551
+
552
+ describe "fields on interfaces" do
553
+ let ( :document ) {
554
+ GraphQL . parse <<-GRAPHQL
555
+ query {
556
+ node(id: "Cardinal") {
557
+ id
558
+ ... on BirdSpecies {
559
+ name
560
+ }
561
+ ...Other
562
+ }
563
+ }
564
+ fragment Other on BirdGenus {
565
+ latinName
566
+ }
567
+ GRAPHQL
568
+ }
569
+
570
+ it "returns true for fields on direct object types" do
571
+ node_lookahead = query . lookahead . selection ( "node" )
572
+ assert_equal true , node_lookahead . selects? ( :id )
573
+ end
574
+
575
+ it "returns true for fields on interface types" do
576
+ node_lookahead = query . lookahead . selection ( "node" )
577
+ assert_equal true , node_lookahead . selects? ( :name )
578
+ end
579
+
580
+ it "returns true for fields on interface types through fragments" do
581
+ node_lookahead = query . lookahead . selection ( "node" )
582
+ assert_equal true , node_lookahead . selects? ( :latin_name )
583
+ end
584
+ end
585
+ end
416
586
end
0 commit comments