@@ -506,3 +506,170 @@ fn union_types_merges_inconsistent_unions() {
506506 . expect ( "Union U should exist" ) ;
507507 assert_snapshot ! ( union_u, @"union U = A | B | C" ) ;
508508}
509+
510+ // =============================================================================
511+ // @oneOf INPUT OBJECTS - Tests for @oneOf directive merging behavior
512+ // =============================================================================
513+
514+ #[ test]
515+ fn one_of_input_object_merges_when_consistent ( ) {
516+ let subgraph_a = ServiceDefinition {
517+ name : "subgraphA" ,
518+ type_defs : r#"
519+ type Query {
520+ find(input: FindInput!): String @shareable
521+ }
522+
523+ input FindInput @oneOf {
524+ id: ID
525+ name: String
526+ }
527+ "# ,
528+ } ;
529+
530+ let subgraph_b = ServiceDefinition {
531+ name : "subgraphB" ,
532+ type_defs : r#"
533+ type Query {
534+ find(input: FindInput!): String @shareable
535+ }
536+
537+ input FindInput @oneOf {
538+ id: ID
539+ name: String
540+ }
541+ "# ,
542+ } ;
543+
544+ let result = compose_as_fed2_subgraphs ( & [ subgraph_a, subgraph_b] ) ;
545+ let supergraph = result. expect ( "Expected composition to succeed" ) ;
546+ let api_schema = supergraph
547+ . to_api_schema ( Default :: default ( ) )
548+ . expect ( "Expected API schema generation to succeed" ) ;
549+ let find_input = coord ! ( FindInput )
550+ . lookup ( api_schema. schema ( ) )
551+ . expect ( "FindInput should exist" ) ;
552+ assert_snapshot ! ( find_input, @r"
553+ input FindInput @oneOf {
554+ id: ID
555+ name: String
556+ }
557+ " ) ;
558+ }
559+
560+ #[ test]
561+ fn one_of_input_object_errors_when_inconsistent ( ) {
562+ let subgraph_a = ServiceDefinition {
563+ name : "subgraphA" ,
564+ type_defs : r#"
565+ type Query {
566+ find(input: FindInput!): String @shareable
567+ }
568+
569+ input FindInput @oneOf {
570+ id: ID
571+ name: String
572+ }
573+ "# ,
574+ } ;
575+
576+ let subgraph_b = ServiceDefinition {
577+ name : "subgraphB" ,
578+ type_defs : r#"
579+ type Query {
580+ find(input: FindInput!): String @shareable
581+ }
582+
583+ input FindInput {
584+ id: ID
585+ name: String
586+ }
587+ "# ,
588+ } ;
589+
590+ let result = compose_as_fed2_subgraphs ( & [ subgraph_a, subgraph_b] ) ;
591+ assert_composition_errors (
592+ & result,
593+ & [ (
594+ "INPUT_OBJECT_ONE_OF_MISMATCH" ,
595+ r#"Input object type "FindInput" is marked with @oneOf in subgraph "subgraphA" but not in subgraph "subgraphB""# ,
596+ ) ] ,
597+ ) ;
598+ }
599+
600+ #[ test]
601+ fn one_of_input_object_merges_single_subgraph ( ) {
602+ let subgraph_a = ServiceDefinition {
603+ name : "subgraphA" ,
604+ type_defs : r#"
605+ type Query {
606+ find(input: FindInput!): String
607+ }
608+
609+ input FindInput @oneOf {
610+ id: ID
611+ name: String
612+ }
613+ "# ,
614+ } ;
615+
616+ let result = compose_as_fed2_subgraphs ( & [ subgraph_a] ) ;
617+ let supergraph = result. expect ( "Expected composition to succeed" ) ;
618+ let api_schema = supergraph
619+ . to_api_schema ( Default :: default ( ) )
620+ . expect ( "Expected API schema generation to succeed" ) ;
621+ let find_input = coord ! ( FindInput )
622+ . lookup ( api_schema. schema ( ) )
623+ . expect ( "FindInput should exist" ) ;
624+ assert_snapshot ! ( find_input, @r"
625+ input FindInput @oneOf {
626+ id: ID
627+ name: String
628+ }
629+ " ) ;
630+ }
631+
632+ #[ test]
633+ fn one_of_input_object_with_different_fields_across_subgraphs ( ) {
634+ let subgraph_a = ServiceDefinition {
635+ name : "subgraphA" ,
636+ type_defs : r#"
637+ type Query {
638+ find(input: FindInput!): String @shareable
639+ }
640+
641+ input FindInput @oneOf {
642+ id: ID
643+ name: String
644+ }
645+ "# ,
646+ } ;
647+
648+ let subgraph_b = ServiceDefinition {
649+ name : "subgraphB" ,
650+ type_defs : r#"
651+ type Query {
652+ find(input: FindInput!): String @shareable
653+ }
654+
655+ input FindInput @oneOf {
656+ id: ID
657+ email: String
658+ }
659+ "# ,
660+ } ;
661+
662+ let result = compose_as_fed2_subgraphs ( & [ subgraph_a, subgraph_b] ) ;
663+ let supergraph = result. expect ( "Expected composition to succeed" ) ;
664+ let api_schema = supergraph
665+ . to_api_schema ( Default :: default ( ) )
666+ . expect ( "Expected API schema generation to succeed" ) ;
667+ let find_input = coord ! ( FindInput )
668+ . lookup ( api_schema. schema ( ) )
669+ . expect ( "FindInput should exist" ) ;
670+ assert_snapshot ! ( find_input, @r"
671+ input FindInput @oneOf {
672+ id: ID
673+ }
674+ " ) ;
675+ }
0 commit comments