Skip to content

Commit 986e75f

Browse files
committed
Test union codegen
1 parent 0230a28 commit 986e75f

File tree

2 files changed

+81
-61
lines changed

2 files changed

+81
-61
lines changed

graphql_client/tests/union_query.rs

Lines changed: 61 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,32 @@ fn union_query_deserialization() {
3232

3333
let expected = union_query::ResponseData {
3434
names: Some(vec![
35-
union_query::UnionQueryNames::Person {
36-
first_name: "Audrey".to_string(),
37-
last_name: Some("Lorde".to_string()),
35+
union_query::UnionQueryNames {
36+
typename: "Person".into(),
37+
on: union_query::UnionQueryNamesOn::Person(union_query::UnionQueryNamesOnPerson {
38+
first_name: "Audrey".to_string(),
39+
last_name: Some("Lorde".to_string()),
40+
}),
3841
},
39-
union_query::UnionQueryNames::Dog {
40-
name: "Laïka".to_string(),
42+
union_query::UnionQueryNames {
43+
typename: "Dog".into(),
44+
on: union_query::UnionQueryNamesOn::Dog(union_query::UnionQueryNamesOnDog {
45+
name: "Laïka".to_string(),
46+
}),
4147
},
42-
union_query::UnionQueryNames::Organization {
43-
title: "Mozilla".to_string(),
48+
union_query::UnionQueryNames {
49+
typename: "Organization".into(),
50+
on: union_query::UnionQueryNamesOn::Organization(
51+
union_query::UnionQueryNamesOnOrganization {
52+
title: "Mozilla".to_string(),
53+
},
54+
),
4455
},
45-
union_query::UnionQueryNames::Dog {
46-
name: "Norbert".to_string(),
56+
union_query::UnionQueryNames {
57+
typename: "Dog".into(),
58+
on: union_query::UnionQueryNamesOn::Dog(union_query::UnionQueryNamesOnDog {
59+
name: "Norbert".to_string(),
60+
}),
4761
},
4862
]),
4963
};
@@ -60,24 +74,32 @@ fn fragment_on_union() {
6074
let expected = fragment_on_union::ResponseData {
6175
names: Some(vec![
6276
fragment_on_union::FragmentOnUnionNames {
63-
names_fragment: fragment_on_union::NamesFragment::Person {
64-
first_name: "Audrey".to_string(),
65-
},
77+
names_fragment: fragment_on_union::NamesFragment::Person(
78+
fragment_on_union::NamesFragmentOnPerson {
79+
first_name: "Audrey".to_string(),
80+
},
81+
),
6682
},
6783
fragment_on_union::FragmentOnUnionNames {
68-
names_fragment: fragment_on_union::NamesFragment::Dog {
69-
name: "Laïka".to_string(),
70-
},
84+
names_fragment: fragment_on_union::NamesFragment::Dog(
85+
fragment_on_union::NamesFragmentOnDog {
86+
name: "Laïka".to_string(),
87+
},
88+
),
7189
},
7290
fragment_on_union::FragmentOnUnionNames {
73-
names_fragment: fragment_on_union::NamesFragment::Organization {
74-
title: "Mozilla".to_string(),
75-
},
91+
names_fragment: fragment_on_union::NamesFragment::Organization(
92+
fragment_on_union::NamesFragmentOnOrganization {
93+
title: "Mozilla".to_string(),
94+
},
95+
),
7696
},
7797
fragment_on_union::FragmentOnUnionNames {
78-
names_fragment: fragment_on_union::NamesFragment::Dog {
79-
name: "Norbert".to_string(),
80-
},
98+
names_fragment: fragment_on_union::NamesFragment::Dog(
99+
fragment_on_union::NamesFragmentOnDog {
100+
name: "Norbert".to_string(),
101+
},
102+
),
81103
},
82104
]),
83105
};
@@ -87,21 +109,22 @@ fn fragment_on_union() {
87109

88110
#[test]
89111
fn fragment_and_more_on_union() {
90-
let _expected = fragment_and_more_on_union::ResponseData {
91-
names: Some(vec![
92-
fragment_and_more_on_union::FragmentAndMoreOnUnionNames::Person {
93-
first_name: "Audrey".to_string(),
94-
last_name: Some("Lorde".to_string()),
95-
},
96-
fragment_and_more_on_union::FragmentAndMoreOnUnionNames::Dog {
97-
name: "Laïka".to_string(),
98-
},
99-
fragment_and_more_on_union::FragmentAndMoreOnUnionNames::Organization {
100-
title: "Mozilla".to_string(),
101-
},
102-
fragment_and_more_on_union::FragmentAndMoreOnUnionNames::Dog {
103-
name: "Norbert".to_string(),
104-
},
105-
]),
106-
};
112+
todo!();
113+
// let _expected = fragment_and_more_on_union::ResponseData {
114+
// names: Some(vec![
115+
// fragment_and_more_on_union::FragmentAndMoreOnUnionNames::Person {
116+
// first_name: "Audrey".to_string(),
117+
// last_name: Some("Lorde".to_string()),
118+
// },
119+
// fragment_and_more_on_union::FragmentAndMoreOnUnionNames::Dog {
120+
// name: "Laïka".to_string(),
121+
// },
122+
// fragment_and_more_on_union::FragmentAndMoreOnUnionNames::Organization {
123+
// title: "Mozilla".to_string(),
124+
// },
125+
// fragment_and_more_on_union::FragmentAndMoreOnUnionNames::Dog {
126+
// name: "Norbert".to_string(),
127+
// },
128+
// ]),
129+
// };
107130
}

graphql_client_codegen/src/codegen.rs

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -362,9 +362,13 @@ fn render_selection<'a>(
362362
options,
363363
);
364364

365-
let enum_definition =
366-
render_union_enum(response_derives, &struct_name, &variants);
367-
response_type_buffer.push(enum_definition);
365+
let struct_definition = render_object_like_struct(
366+
response_derives,
367+
&struct_name,
368+
&fields,
369+
&variants,
370+
);
371+
response_type_buffer.push(struct_definition);
368372
}
369373
TypeId::Input(_) => unreachable!("field selection on input type"),
370374
};
@@ -396,23 +400,17 @@ fn render_selection<'a>(
396400
options,
397401
);
398402

399-
let variant = quote!(#variant_name { });
403+
let variant = quote!(#variant_name(#variant_struct_name));
400404
variants_buffer.push(variant);
401405

402-
match q.refocus(inline).on().item {
403-
TypeId::Object(_) | TypeId::Interface(_) => {
404-
let struct_definition = render_object_like_struct(
405-
response_derives,
406-
&variant_struct_name_str,
407-
&fields,
408-
&variants,
409-
);
406+
let struct_definition = render_object_like_struct(
407+
response_derives,
408+
&variant_struct_name_str,
409+
&fields,
410+
&variants,
411+
);
410412

411-
response_type_buffer.push(struct_definition);
412-
}
413-
TypeId::Union(_) => todo!("inline fragment on union"),
414-
other => unreachable!("Inline fragment on non composite type ({:?})", other),
415-
}
413+
response_type_buffer.push(struct_definition);
416414
}
417415
Selection::FragmentSpread(frag) => {
418416
let frag = q.refocus(*frag);
@@ -431,11 +429,9 @@ fn render_selection<'a>(
431429
}
432430

433431
fn field_name(field: &WithQuery<'_, &SelectedField>) -> impl quote::ToTokens {
434-
let name = field
435-
.alias()
436-
.unwrap_or_else(|| field.name())
437-
.to_snake_case();
438-
let final_name = keyword_replace(&name);
432+
let name = field.alias().unwrap_or_else(|| field.name());
433+
let snake_case_name = name.to_snake_case();
434+
let final_name = keyword_replace(&snake_case_name);
439435
let rename_annotation = field_rename_annotation(&name, &final_name);
440436

441437
let ident = Ident::new(&final_name, Span::call_site());
@@ -546,7 +542,7 @@ fn render_object_like_struct(
546542
let enum_name = Ident::new(&enum_name_str, Span::call_site());
547543

548544
(
549-
Some(quote!(on: #enum_name,)),
545+
Some(quote!(#[serde(flatten)] pub on: #enum_name,)),
550546
Some(render_union_enum(
551547
response_derives,
552548
&enum_name_str,
@@ -579,6 +575,7 @@ fn render_union_enum(
579575

580576
quote! {
581577
#response_derives
578+
#[serde(tag = "__typename")]
582579
pub enum #enum_ident {
583580
#(#variants,)*
584581
}

0 commit comments

Comments
 (0)