@@ -9,11 +9,10 @@ use apollo_compiler::ast::{
99 OperationType , SchemaDefinition , Selection , Type , UnionTypeDefinition , Value ,
1010 VariableDefinition ,
1111} ;
12- use apollo_compiler:: schema:: { ExtendedType , InterfaceType , ObjectType } ;
12+ use apollo_compiler:: schema:: { ExtendedType , InterfaceType , } ;
1313use apollo_compiler:: { Node , NodeStr , Schema } ;
1414
1515use crate :: next:: ast:: directive_definition:: DirectiveDefinitionIterExt ;
16- use crate :: next:: ast:: DefinitionHasFields ;
1716use crate :: next:: schema:: extended_type:: { ExtendedTypeExt , ExtendedTypeKind } ;
1817use crate :: next:: schema:: object_type:: ObjectTypeExt ;
1918use crate :: next:: schema:: schema:: SchemaExt ;
@@ -461,9 +460,9 @@ impl Unstructured<'_> {
461460 . ty ( self ) ?;
462461 Ok ( VariableDefinition {
463462 name : self . unique_name ( ) ,
464- ty : Node :: new ( ty) ,
465463 default_value : self
466464 . arbitrary_optional ( |u| Ok ( Node :: new ( u. arbitrary_value ( schema, & ty) ?) ) ) ?,
465+ ty : Node :: new ( ty) ,
467466 directives : schema
468467 . sample_directives ( self ) ?
469468 . into_iter ( )
@@ -479,7 +478,7 @@ impl Unstructured<'_> {
479478 ) ?;
480479
481480 Ok ( InlineFragment {
482- type_condition : self . arbitrary_optional ( |u | Ok ( ty. name ( ) . clone ( ) ) ) ?,
481+ type_condition : self . arbitrary_optional ( |_ | Ok ( ty. name ( ) . clone ( ) ) ) ?,
483482 directives : schema
484483 . sample_directives ( self ) ?
485484 . into_iter ( )
@@ -503,20 +502,44 @@ impl Unstructured<'_> {
503502 fn arbitrary_selection (
504503 & mut self ,
505504 schema : & Schema ,
506- object_type : & dyn super :: schema:: TypeHasFields ,
505+ ty : & dyn super :: schema:: TypeHasFields ,
507506 ) -> Result < Selection > {
508- if let Some ( field) = object_type. random_field ( self ) ? {
509- match self . choose_index ( 3 ) {
510- Ok ( 0 ) => Ok ( Selection :: Field ( Node :: new ( self . arbitrary_field ( schema) ?) ) ) ,
511- Ok ( 1 ) => Ok ( Selection :: FragmentSpread ( Node :: new (
512- self . arbitrary_fragment_spread ( schema) ?,
513- ) ) ) ,
514- Ok ( 2 ) => Ok ( Selection :: InlineFragment ( Node :: new (
515- self . arbitrary_inline_fragment ( schema) ?,
516- ) ) ) ,
517- _ => unreachable ! ( ) ,
518- }
507+ match self . choose_index ( 3 ) {
508+ Ok ( 0 ) => {
509+ let field = ty. random_field ( self ) ?;
510+ let field_ty = schema. types . get ( field. ty . inner_named_type ( ) ) . expect ( "type must exist" ) ;
511+ let selection_set = if field_ty. is_object ( ) || field_ty. is_interface ( ) {
512+ self . arbitrary_vec ( 0 , 5 , |u| {
513+ Ok ( u. arbitrary_selection ( schema, field_ty) ?)
514+ } ) ?
515+ } else {
516+ vec ! [ ]
517+ } ;
518+ Ok ( Selection :: Field ( Node :: new ( Field {
519+ alias : self . arbitrary_optional ( |u|Ok ( u. unique_name ( ) ) ) ?,
520+ name : self . unique_name ( ) ,
521+ arguments : self . arbitrary_vec ( 0 , 5 , |u| {
522+ Ok ( Node :: new ( Argument {
523+ name : u. unique_name ( ) ,
524+ value : Node :: new ( u. arbitrary_value ( schema, & field. ty ) ?) ,
525+ } ) )
526+ } ) ?,
527+ directives : schema. sample_directives ( self ) ?
528+ . into_iter ( )
529+ . with_location ( DirectiveLocation :: Field )
530+ . try_collect ( self , schema) ?,
531+ selection_set,
532+ } ) ) )
533+ } ,
534+ Ok ( 1 ) => Ok ( Selection :: FragmentSpread ( Node :: new (
535+ self . arbitrary_fragment_spread ( schema) ?,
536+ ) ) ) ,
537+ Ok ( 2 ) => Ok ( Selection :: InlineFragment ( Node :: new (
538+ self . arbitrary_inline_fragment ( schema) ?,
539+ ) ) ) ,
540+ _ => unreachable ! ( ) ,
519541 }
542+
520543 }
521544}
522545
0 commit comments