diff --git a/juniper/src/executor_tests/executor.rs b/juniper/src/executor_tests/executor.rs index ba46f819..00339f8e 100644 --- a/juniper/src/executor_tests/executor.rs +++ b/juniper/src/executor_tests/executor.rs @@ -197,6 +197,81 @@ mod merge_parallel_fragments { } } +mod merge_parallel_inline_fragments { + use value::Value; + use schema::model::RootNode; + use types::scalars::EmptyMutation; + + struct Type; + + graphql_object!(Type: () |&self| { + field a() -> &str { "Apple" } + field b() -> &str { "Banana" } + field c() -> &str { "Cherry" } + field deep() -> Type { Type } + }); + + #[test] + fn test() { + let schema = RootNode::new(Type, EmptyMutation::<()>::new()); + let doc = r" + { a, ...FragOne } + fragment FragOne on Type { + b + deep { + b + deeper: deep { b } + + ... on Type { + c + deeper: deep { c } + } + } + c + }"; + + let vars = vec![].into_iter().collect(); + + let (result, errs) = ::execute(doc, None, &schema, &vars, &()).expect("Execution failed"); + + assert_eq!(errs, []); + + println!("Result: {:?}", result); + + assert_eq!( + result, + Value::object( + vec![ + ("a", Value::string("Apple")), + ("b", Value::string("Banana")), + ( + "deep", + Value::object( + vec![ + ("b", Value::string("Banana")), + ( + "deeper", + Value::object( + vec![ + ("b", Value::string("Banana")), + ("c", Value::string("Cherry")), + ].into_iter() + .collect(), + ), + ), + ("c", Value::string("Cherry")), + ].into_iter() + .collect(), + ), + ), + ("c", Value::string("Cherry")), + ].into_iter() + .collect() + ) + ); + } +} + mod threads_context_correctly { use value::Value; use types::scalars::EmptyMutation; diff --git a/juniper/src/types/base.rs b/juniper/src/types/base.rs index 5fbe7144..90370d21 100644 --- a/juniper/src/types/base.rs +++ b/juniper/src/types/base.rs @@ -455,7 +455,7 @@ where if let Ok(Value::Object(mut hash_map)) = sub_result { for (k, v) in hash_map.drain(..) { - result.insert(k, v); + merge_key_into(result, &k, v); } } else if let Err(e) = sub_result { sub_exec.push_error_at(e, start_pos.clone());