use graphql_client::*; const RESPONSE: &str = include_str!("unions/union_query_response.json"); const FRAGMENT_AND_MORE_RESPONSE: &str = include_str!("unions/fragment_and_more_response.json"); #[derive(GraphQLQuery)] #[graphql( query_path = "tests/unions/union_query.graphql", schema_path = "tests/unions/union_schema.graphql", response_derives = "Debug, PartialEq, Eq" )] pub struct UnionQuery; #[derive(GraphQLQuery)] #[graphql( query_path = "tests/unions/union_query.graphql", schema_path = "tests/unions/union_schema.graphql", response_derives = "Debug, PartialEq, Eq" )] pub struct FragmentOnUnion; #[derive(GraphQLQuery)] #[graphql( query_path = "tests/unions/union_query.graphql", schema_path = "tests/unions/union_schema.graphql", response_derives = "Debug, PartialEq, Eq" )] pub struct FragmentAndMoreOnUnion; #[test] fn union_query_deserialization() { let response_data: union_query::ResponseData = serde_json::from_str(RESPONSE).unwrap(); let expected = union_query::ResponseData { names: Some(vec![ union_query::UnionQueryNames::Person(union_query::UnionQueryNamesOnPerson { first_name: "Audrey".to_string(), last_name: Some("Lorde".to_string()), }), union_query::UnionQueryNames::Dog(union_query::UnionQueryNamesOnDog { name: "Laïka".to_string(), }), union_query::UnionQueryNames::Organization( union_query::UnionQueryNamesOnOrganization { title: "Mozilla".to_string(), }, ), union_query::UnionQueryNames::Dog(union_query::UnionQueryNamesOnDog { name: "Norbert".to_string(), }), ]), }; assert_eq!(response_data, expected); assert_eq!(response_data.names.map(|names| names.len()), Some(4)); } #[test] fn fragment_on_union() { let response_data: fragment_on_union::ResponseData = serde_json::from_str(RESPONSE).unwrap(); let expected = fragment_on_union::ResponseData { names: Some(vec![ fragment_on_union::NamesFragment::Person(fragment_on_union::NamesFragmentOnPerson { first_name: "Audrey".to_string(), }), fragment_on_union::NamesFragment::Dog(fragment_on_union::NamesFragmentOnDog { name: "Laïka".to_string(), }), fragment_on_union::NamesFragment::Organization( fragment_on_union::NamesFragmentOnOrganization { title: "Mozilla".to_string(), }, ), fragment_on_union::NamesFragment::Dog(fragment_on_union::NamesFragmentOnDog { name: "Norbert".to_string(), }), ]), }; assert_eq!(response_data, expected); } #[test] fn fragment_and_more_on_union() { use fragment_and_more_on_union::*; let response_data: fragment_and_more_on_union::ResponseData = serde_json::from_str(FRAGMENT_AND_MORE_RESPONSE).unwrap(); let expected = fragment_and_more_on_union::ResponseData { names: Some(vec![ FragmentAndMoreOnUnionNames { names_fragment: NamesFragment::Person(NamesFragmentOnPerson { first_name: "Larry".into(), }), on: FragmentAndMoreOnUnionNamesOn::Person, }, FragmentAndMoreOnUnionNames { names_fragment: NamesFragment::Dog(NamesFragmentOnDog { name: "Laïka".into(), }), on: FragmentAndMoreOnUnionNamesOn::Dog(FragmentAndMoreOnUnionNamesOnDog { is_good_dog: true, }), }, FragmentAndMoreOnUnionNames { names_fragment: NamesFragment::Organization(NamesFragmentOnOrganization { title: "Mozilla".into(), }), on: FragmentAndMoreOnUnionNamesOn::Organization, }, FragmentAndMoreOnUnionNames { names_fragment: NamesFragment::Dog(NamesFragmentOnDog { name: "Norbert".into(), }), on: FragmentAndMoreOnUnionNamesOn::Dog(FragmentAndMoreOnUnionNamesOnDog { is_good_dog: true, }), }, ]), }; assert_eq!(response_data, expected); }