@@ -32,9 +32,16 @@ public function getVisitor(QueryValidationContext $context): array
3232 }
3333
3434 $ providedFields = [];
35+ $ nullFields = [];
36+
3537 foreach ($ node ->fields as $ fieldNode ) {
3638 $ fieldName = $ fieldNode ->name ->value ;
3739 $ providedFields [] = $ fieldName ;
40+
41+ // Check if the field value is explicitly null
42+ if ($ fieldNode ->value ->kind === NodeKind::NULL ) {
43+ $ nullFields [] = $ fieldName ;
44+ }
3845 }
3946
4047 $ fieldCount = count ($ providedFields );
@@ -44,11 +51,26 @@ public function getVisitor(QueryValidationContext $context): array
4451 static ::oneOfInputObjectExpectedExactlyOneFieldMessage ($ namedType ->name ),
4552 [$ node ]
4653 ));
47- } elseif ($ fieldCount > 1 ) {
54+
55+ return ;
56+ }
57+
58+ if ($ fieldCount > 1 ) {
4859 $ context ->reportError (new Error (
4960 static ::oneOfInputObjectExpectedExactlyOneFieldMessage ($ namedType ->name , $ fieldCount ),
5061 [$ node ]
5162 ));
63+
64+ return ;
65+ }
66+
67+ // At this point, $fieldCount === 1
68+ if (count ($ nullFields ) > 0 ) {
69+ // Exactly one field provided, but it's null
70+ $ context ->reportError (new Error (
71+ static ::oneOfInputObjectFieldValueMustNotBeNullMessage ($ namedType ->name , $ nullFields [0 ]),
72+ [$ node ]
73+ ));
5274 }
5375 },
5476 ];
@@ -62,4 +84,9 @@ public static function oneOfInputObjectExpectedExactlyOneFieldMessage(string $ty
6284
6385 return "OneOf input object ' {$ typeName }' must specify exactly one field, but {$ providedCount } fields were provided. " ;
6486 }
87+
88+ public static function oneOfInputObjectFieldValueMustNotBeNullMessage (string $ typeName , string $ fieldName ): string
89+ {
90+ return "OneOf input object ' {$ typeName }' field ' {$ fieldName }' must be non-null. " ;
91+ }
6592}
0 commit comments