Skip to content

Commit ffef604

Browse files
authored
Merge pull request #549 from Netflix/cole/fix/union-fragment-client
fix(ClientApiGenFragmentTestv2.kt): fragment name projection
2 parents b60525b + 2f8fa41 commit ffef604

File tree

5 files changed

+71
-23
lines changed

5 files changed

+71
-23
lines changed

graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/generators/java/ClientApiGeneratorv2.kt

+5-4
Original file line numberDiff line numberDiff line change
@@ -402,23 +402,24 @@ class ClientApiGeneratorv2(private val config: CodeGenConfig, private val docume
402402
val rootRef = if (javaType.build().name == rootType.name) "this" else "getRoot()"
403403
val rootTypeName = if (javaType.build().name == rootType.name) "${rootType.name}<PARENT, ROOT>" else "ROOT"
404404
val parentRef = javaType.build().name
405-
val projectionName = "${it.name.capitalized()}Projection"
406-
val typeVariable = TypeVariableName.get("$projectionName<$parentRef<PARENT, ROOT>, $rootTypeName>")
405+
val projectionName = "${it.name.capitalized()}Fragment"
406+
val fullProjectionName = "${projectionName}Projection"
407+
val typeVariable = TypeVariableName.get("$fullProjectionName<$parentRef<PARENT, ROOT>, $rootTypeName>")
407408
javaType.addMethod(
408409
MethodSpec.methodBuilder("on${it.name}")
409410
.addModifiers(Modifier.PUBLIC)
410411
.returns(typeVariable)
411412
.addCode(
412413
"""
413-
|$projectionName<$parentRef<PARENT, ROOT>, $rootTypeName> fragment = new $projectionName<>(this, $rootRef);
414+
|$fullProjectionName<$parentRef<PARENT, ROOT>, $rootTypeName> fragment = new $fullProjectionName<>(this, $rootRef);
414415
|getFragments().add(fragment);
415416
|return fragment;
416417
""".trimMargin()
417418
)
418419
.build()
419420
)
420421

421-
return createFragment(it as ObjectTypeDefinition, javaType.build(), rootType, "${it.name.capitalized()}", processedEdges, queryDepth)
422+
return createFragment(it as ObjectTypeDefinition, javaType.build(), rootType, projectionName, processedEdges, queryDepth)
422423
}
423424

424425
private fun createFragment(type: ObjectTypeDefinition, parent: TypeSpec, root: TypeSpec, prefix: String, processedEdges: Set<Pair<String, String>>, queryDepth: Int): CodeGenResult {

graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/EntitiesClientApiGenTestv2.kt

+5-4
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,11 @@ class EntitiesClientApiGenTestv2 {
130130
val projections = codeGenResult.clientProjections
131131
assertThat(projections[0].typeSpec.name).isEqualTo("SearchProjectionRoot")
132132
assertThat(projections[1].typeSpec.name).isEqualTo("IActorProjection")
133-
assertThat(projections[2].typeSpec.name).isEqualTo("ActorProjection")
134-
assertThat(projections[3].typeSpec.name).isEqualTo("EntitiesProjectionRoot")
135-
assertThat(projections[3].typeSpec.methodSpecs).extracting("name").contains("onMovie")
136-
assertThat(projections[4].typeSpec.name).isEqualTo("EntitiesMovieKeyProjection")
133+
assertThat(projections[2].typeSpec.name).isEqualTo("ActorFragmentProjection")
134+
assertThat(projections[3].typeSpec.name).isEqualTo("ActorProjection")
135+
assertThat(projections[4].typeSpec.name).isEqualTo("EntitiesProjectionRoot")
136+
assertThat(projections[4].typeSpec.methodSpecs).extracting("name").contains("onMovie")
137+
assertThat(projections[5].typeSpec.name).isEqualTo("EntitiesMovieKeyProjection")
137138

138139
val representations = codeGenResult.javaDataTypes.filter { "Representation" in it.typeSpec.name }
139140
assertThat(representations).hasSize(2)

graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapiv2/ClientApiGenFragmentTestv2.kt

+54-8
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ class ClientApiGenFragmentTestv2 {
6161
assertThat(codeGenResult.clientProjections.size).isEqualTo(3)
6262
assertThat(codeGenResult.clientProjections[0].typeSpec.name).isEqualTo("SearchProjectionRoot")
6363
assertThat(codeGenResult.clientProjections[0].typeSpec.methodSpecs).extracting("name").contains("title")
64-
assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieProjection")
64+
assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieFragmentProjection")
6565
assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").contains("duration")
6666
assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").contains("title")
6767
assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name")
6868
.doesNotContain("episodes")
69-
assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("SeriesProjection")
69+
assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("SeriesFragmentProjection")
7070
assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").contains("episodes")
7171
assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").contains("title")
7272
assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name")
@@ -116,12 +116,12 @@ class ClientApiGenFragmentTestv2 {
116116
assertThat(codeGenResult.clientProjections[0].typeSpec.name).isEqualTo("SearchProjectionRoot")
117117
assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("ShowProjection")
118118
assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").contains("title")
119-
assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("MovieProjection")
119+
assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("MovieFragmentProjection")
120120
assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").contains("duration")
121121
assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").contains("title")
122122
assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name")
123123
.doesNotContain("episodes")
124-
assertThat(codeGenResult.clientProjections[3].typeSpec.name).isEqualTo("SeriesProjection")
124+
assertThat(codeGenResult.clientProjections[3].typeSpec.name).isEqualTo("SeriesFragmentProjection")
125125
assertThat(codeGenResult.clientProjections[3].typeSpec.methodSpecs).extracting("name").contains("episodes")
126126
assertThat(codeGenResult.clientProjections[3].typeSpec.methodSpecs).extracting("name").contains("title")
127127
assertThat(codeGenResult.clientProjections[3].typeSpec.methodSpecs).extracting("name")
@@ -162,10 +162,10 @@ class ClientApiGenFragmentTestv2 {
162162
assertThat(codeGenResult.clientProjections[0].typeSpec.name).isEqualTo("SearchProjectionRoot")
163163
assertThat(codeGenResult.clientProjections[0].typeSpec.methodSpecs).extracting("name").contains("onMovie")
164164
assertThat(codeGenResult.clientProjections[0].typeSpec.methodSpecs).extracting("name").contains("onActor")
165-
assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieProjection")
165+
assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieFragmentProjection")
166166
assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").contains("title")
167167
assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").doesNotContain("name")
168-
assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("ActorProjection")
168+
assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("ActorFragmentProjection")
169169
assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").contains("name")
170170
assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").doesNotContain("title")
171171

@@ -174,6 +174,52 @@ class ClientApiGenFragmentTestv2 {
174174
)
175175
}
176176

177+
@Test
178+
fun unionFragmentSharingSubProjection() {
179+
val schema = """
180+
type Query {
181+
search: [Result]
182+
actor: Actor
183+
}
184+
185+
union Result = Movie | Actor
186+
187+
type Movie {
188+
title: String
189+
}
190+
191+
type Actor {
192+
name: String
193+
}
194+
""".trimIndent()
195+
196+
val codeGenResult = CodeGen(
197+
CodeGenConfig(
198+
schemas = setOf(schema),
199+
packageName = basePackageName,
200+
generateClientApiv2 = true
201+
)
202+
).generate()
203+
204+
assertThat(codeGenResult.clientProjections.size).isEqualTo(4)
205+
assertThat(codeGenResult.clientProjections[0].typeSpec.name).isEqualTo("SearchProjectionRoot")
206+
assertThat(codeGenResult.clientProjections[0].typeSpec.methodSpecs).extracting("name").contains("onMovie")
207+
assertThat(codeGenResult.clientProjections[0].typeSpec.methodSpecs).extracting("name").contains("onActor")
208+
assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieFragmentProjection")
209+
assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").contains("title")
210+
assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").doesNotContain("name")
211+
assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("ActorFragmentProjection")
212+
assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").contains("name")
213+
assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").doesNotContain("title")
214+
assertThat(codeGenResult.clientProjections[3].typeSpec.name).isEqualTo("ActorProjectionRoot")
215+
assertThat(codeGenResult.clientProjections[3].typeSpec.methodSpecs).extracting("name").contains("name")
216+
assertThat(codeGenResult.clientProjections[3].typeSpec.methodSpecs).extracting("name").doesNotContain("title")
217+
218+
assertCompilesJava(
219+
codeGenResult.clientProjections + codeGenResult.javaQueryTypes + codeGenResult.javaEnumTypes + codeGenResult.javaDataTypes + codeGenResult.javaInterfaces
220+
)
221+
}
222+
177223
@Test
178224
fun unionFragmentOnSubType() {
179225
val schema = """
@@ -212,10 +258,10 @@ class ClientApiGenFragmentTestv2 {
212258
assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").doesNotContain("name")
213259
assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").contains("onMovie")
214260
assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").contains("onActor")
215-
assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("MovieProjection")
261+
assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("MovieFragmentProjection")
216262
assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").contains("title")
217263
assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").doesNotContain("name")
218-
assertThat(codeGenResult.clientProjections[3].typeSpec.name).isEqualTo("ActorProjection")
264+
assertThat(codeGenResult.clientProjections[3].typeSpec.name).isEqualTo("ActorFragmentProjection")
219265
assertThat(codeGenResult.clientProjections[3].typeSpec.methodSpecs).extracting("name").contains("name")
220266
assertThat(codeGenResult.clientProjections[3].typeSpec.methodSpecs).extracting("name").doesNotContain("title")
221267

graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapiv2/ClientApiGenProjectionTestv2.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ class ClientApiGenProjectionTestv2 {
118118

119119
assertThat(codeGenResult.clientProjections.size).isEqualTo(4)
120120
assertThat(codeGenResult.clientProjections[0].typeSpec.name).isEqualTo("SearchProjectionRoot")
121-
assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieProjection")
121+
assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieFragmentProjection")
122122
assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("DetailsProjection")
123123
assertThat(codeGenResult.clientProjections[3].typeSpec.name).isEqualTo("ShowProjection")
124124

@@ -162,8 +162,8 @@ class ClientApiGenProjectionTestv2 {
162162

163163
assertThat(codeGenResult.clientProjections.size).isEqualTo(5)
164164
assertThat(codeGenResult.clientProjections[0].typeSpec.name).isEqualTo("SearchProjectionRoot")
165-
assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("ShowProjection")
166-
assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("MovieProjection")
165+
assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("ShowFragmentProjection")
166+
assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("MovieFragmentProjection")
167167
assertThat(codeGenResult.clientProjections[3].typeSpec.name).isEqualTo("RelatedProjection")
168168
assertThat(codeGenResult.clientProjections[4].typeSpec.name).isEqualTo("VideoProjection")
169169

graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapiv2/ClientApiGenQueryTestv2.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,8 @@ class ClientApiGenQueryTestv2 {
210210
assertThat(codeGenResult.clientProjections)
211211
.extracting("typeSpec").extracting("name").containsExactly(
212212
"ShowsProjectionRoot",
213-
"ShowProjection",
214-
"MovieProjection",
213+
"ShowFragmentProjection",
214+
"MovieFragmentProjection",
215215
"RelatedProjection",
216216
"VideoProjection"
217217
)
@@ -442,9 +442,9 @@ class ClientApiGenQueryTestv2 {
442442
assertThat(codeGenResult.clientProjections.size).isEqualTo(3)
443443
assertThat(codeGenResult.clientProjections[0].typeSpec.name).isEqualTo("SearchProjectionRoot")
444444
assertThat(codeGenResult.clientProjections[0].typeSpec.methodSpecs[1].name).isEqualTo("title")
445-
assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieProjection")
445+
assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieFragmentProjection")
446446
assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs[2].name).isEqualTo("duration")
447-
assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("SeriesProjection")
447+
assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("SeriesFragmentProjection")
448448
assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs[2].name).isEqualTo("episodes")
449449

450450
assertCompilesJava(

0 commit comments

Comments
 (0)