Skip to content

Commit e0c6b03

Browse files
committed
Add more input value null value tests
These correspond to the table in "3.1.6 Input Objects" in the GraphQL specification.
1 parent 708b99b commit e0c6b03

File tree

1 file changed

+143
-0
lines changed

1 file changed

+143
-0
lines changed

src/executor_tests/variables.rs

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@ graphql_input_object!(
4949
}
5050
);
5151

52+
graphql_input_object!(
53+
#[derive(Debug)]
54+
struct ExampleInputObject {
55+
a: Option<String>,
56+
b: i64,
57+
}
58+
);
59+
5260
graphql_object!(TestType: () |&self| {
5361
field field_with_object_input(input: Option<TestInputObject>) -> String {
5462
format!("{:?}", input)
@@ -85,6 +93,10 @@ graphql_object!(TestType: () |&self| {
8593
field nn_list_nn(input: Vec<String>) -> String {
8694
format!("{:?}", input)
8795
}
96+
97+
field example_input(arg: ExampleInputObject) -> String {
98+
format!("a: {:?}, b: {:?}", arg.a, arg.b)
99+
}
88100
});
89101

90102
fn run_variable_query<F>(query: &str, vars: Variables, f: F)
@@ -748,3 +760,134 @@ fn default_argument_when_nullable_variable_set_to_null() {
748760
Some(&Value::string(r#""Hello World""#)));
749761
});
750762
}
763+
764+
#[test]
765+
fn nullable_input_object_arguments_successful_without_variables() {
766+
run_query(
767+
r#"{ exampleInput(arg: {a: "abc", b: 123}) }"#,
768+
|result| {
769+
assert_eq!(
770+
result.get("exampleInput"),
771+
Some(&Value::string(r#"a: Some("abc"), b: 123"#)));
772+
});
773+
774+
run_query(
775+
r#"{ exampleInput(arg: {a: null, b: 1}) }"#,
776+
|result| {
777+
assert_eq!(
778+
result.get("exampleInput"),
779+
Some(&Value::string(r#"a: None, b: 1"#)));
780+
});
781+
}
782+
783+
#[test]
784+
fn nullable_input_object_arguments_successful_with_variables() {
785+
run_variable_query(
786+
r#"query q($var: Int!) { exampleInput(arg: {b: $var}) }"#,
787+
vec![
788+
("var".to_owned(), InputValue::int(123)),
789+
].into_iter().collect(),
790+
|result| {
791+
assert_eq!(
792+
result.get("exampleInput"),
793+
Some(&Value::string(r#"a: None, b: 123"#)));
794+
});
795+
796+
run_variable_query(
797+
r#"query q($var: String) { exampleInput(arg: {a: $var, b: 1}) }"#,
798+
vec![
799+
("var".to_owned(), InputValue::null()),
800+
].into_iter().collect(),
801+
|result| {
802+
assert_eq!(
803+
result.get("exampleInput"),
804+
Some(&Value::string(r#"a: None, b: 1"#)));
805+
});
806+
807+
run_variable_query(
808+
r#"query q($var: String) { exampleInput(arg: {a: $var, b: 1}) }"#,
809+
vec![
810+
].into_iter().collect(),
811+
|result| {
812+
assert_eq!(
813+
result.get("exampleInput"),
814+
Some(&Value::string(r#"a: None, b: 1"#)));
815+
});
816+
}
817+
818+
#[test]
819+
fn does_not_allow_missing_required_field() {
820+
let schema = RootNode::new(TestType, EmptyMutation::<()>::new());
821+
822+
let query = r#"{ exampleInput(arg: {a: "abc"}) }"#;
823+
let vars = vec![
824+
].into_iter().collect();
825+
826+
let error = ::execute(query, None, &schema, &vars, &())
827+
.unwrap_err();
828+
829+
assert_eq!(error, ValidationError(vec![
830+
RuleError::new(
831+
r#"Invalid value for argument "arg", expected type "ExampleInputObject!""#,
832+
&[SourcePosition::new(20, 0, 20)],
833+
),
834+
]));
835+
}
836+
837+
#[test]
838+
fn does_not_allow_null_in_required_field() {
839+
let schema = RootNode::new(TestType, EmptyMutation::<()>::new());
840+
841+
let query = r#"{ exampleInput(arg: {a: "abc", b: null}) }"#;
842+
let vars = vec![
843+
].into_iter().collect();
844+
845+
let error = ::execute(query, None, &schema, &vars, &())
846+
.unwrap_err();
847+
848+
assert_eq!(error, ValidationError(vec![
849+
RuleError::new(
850+
r#"Invalid value for argument "arg", expected type "ExampleInputObject!""#,
851+
&[SourcePosition::new(20, 0, 20)],
852+
),
853+
]));
854+
}
855+
856+
#[test]
857+
fn does_not_allow_missing_variable_for_required_field() {
858+
let schema = RootNode::new(TestType, EmptyMutation::<()>::new());
859+
860+
let query = r#"query q($var: Int!) { exampleInput(arg: {b: $var}) }"#;
861+
let vars = vec![
862+
].into_iter().collect();
863+
864+
let error = ::execute(query, None, &schema, &vars, &())
865+
.unwrap_err();
866+
867+
assert_eq!(error, ValidationError(vec![
868+
RuleError::new(
869+
r#"Variable "$var" of required type "Int!" was not provided."#,
870+
&[SourcePosition::new(8, 0, 8)],
871+
),
872+
]));
873+
}
874+
875+
#[test]
876+
fn does_not_allow_null_variable_for_required_field() {
877+
let schema = RootNode::new(TestType, EmptyMutation::<()>::new());
878+
879+
let query = r#"query q($var: Int!) { exampleInput(arg: {b: $var}) }"#;
880+
let vars = vec![
881+
("var".to_owned(), InputValue::null()),
882+
].into_iter().collect();
883+
884+
let error = ::execute(query, None, &schema, &vars, &())
885+
.unwrap_err();
886+
887+
assert_eq!(error, ValidationError(vec![
888+
RuleError::new(
889+
r#"Variable "$var" of required type "Int!" was not provided."#,
890+
&[SourcePosition::new(8, 0, 8)],
891+
),
892+
]));
893+
}

0 commit comments

Comments
 (0)