From 2f8fa410c71b668fa8c8f99f9d11bb2d6226c412 Mon Sep 17 00:00:00 2001 From: Cole Turner Date: Tue, 2 May 2023 16:42:42 -0700 Subject: [PATCH] fix(ClientApiGenFragmentTestv2.kt): fragment name projection --- .../generators/java/ClientApiGeneratorv2.kt | 9 +-- .../dgs/codegen/EntitiesClientApiGenTestv2.kt | 9 +-- .../clientapiv2/ClientApiGenFragmentTestv2.kt | 62 ++++++++++++++++--- .../ClientApiGenProjectionTestv2.kt | 6 +- .../clientapiv2/ClientApiGenQueryTestv2.kt | 8 +-- 5 files changed, 71 insertions(+), 23 deletions(-) diff --git a/graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/generators/java/ClientApiGeneratorv2.kt b/graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/generators/java/ClientApiGeneratorv2.kt index 70cd88b03..b489cca4d 100644 --- a/graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/generators/java/ClientApiGeneratorv2.kt +++ b/graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/generators/java/ClientApiGeneratorv2.kt @@ -402,15 +402,16 @@ class ClientApiGeneratorv2(private val config: CodeGenConfig, private val docume val rootRef = if (javaType.build().name == rootType.name) "this" else "getRoot()" val rootTypeName = if (javaType.build().name == rootType.name) "${rootType.name}" else "ROOT" val parentRef = javaType.build().name - val projectionName = "${it.name.capitalized()}Projection" - val typeVariable = TypeVariableName.get("$projectionName<$parentRef, $rootTypeName>") + val projectionName = "${it.name.capitalized()}Fragment" + val fullProjectionName = "${projectionName}Projection" + val typeVariable = TypeVariableName.get("$fullProjectionName<$parentRef, $rootTypeName>") javaType.addMethod( MethodSpec.methodBuilder("on${it.name}") .addModifiers(Modifier.PUBLIC) .returns(typeVariable) .addCode( """ - |$projectionName<$parentRef, $rootTypeName> fragment = new $projectionName<>(this, $rootRef); + |$fullProjectionName<$parentRef, $rootTypeName> fragment = new $fullProjectionName<>(this, $rootRef); |getFragments().add(fragment); |return fragment; """.trimMargin() @@ -418,7 +419,7 @@ class ClientApiGeneratorv2(private val config: CodeGenConfig, private val docume .build() ) - return createFragment(it as ObjectTypeDefinition, javaType.build(), rootType, "${it.name.capitalized()}", processedEdges, queryDepth) + return createFragment(it as ObjectTypeDefinition, javaType.build(), rootType, projectionName, processedEdges, queryDepth) } private fun createFragment(type: ObjectTypeDefinition, parent: TypeSpec, root: TypeSpec, prefix: String, processedEdges: Set>, queryDepth: Int): CodeGenResult { diff --git a/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/EntitiesClientApiGenTestv2.kt b/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/EntitiesClientApiGenTestv2.kt index 948ce0261..711262b4c 100644 --- a/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/EntitiesClientApiGenTestv2.kt +++ b/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/EntitiesClientApiGenTestv2.kt @@ -130,10 +130,11 @@ class EntitiesClientApiGenTestv2 { val projections = codeGenResult.clientProjections assertThat(projections[0].typeSpec.name).isEqualTo("SearchProjectionRoot") assertThat(projections[1].typeSpec.name).isEqualTo("IActorProjection") - assertThat(projections[2].typeSpec.name).isEqualTo("ActorProjection") - assertThat(projections[3].typeSpec.name).isEqualTo("EntitiesProjectionRoot") - assertThat(projections[3].typeSpec.methodSpecs).extracting("name").contains("onMovie") - assertThat(projections[4].typeSpec.name).isEqualTo("EntitiesMovieKeyProjection") + assertThat(projections[2].typeSpec.name).isEqualTo("ActorFragmentProjection") + assertThat(projections[3].typeSpec.name).isEqualTo("ActorProjection") + assertThat(projections[4].typeSpec.name).isEqualTo("EntitiesProjectionRoot") + assertThat(projections[4].typeSpec.methodSpecs).extracting("name").contains("onMovie") + assertThat(projections[5].typeSpec.name).isEqualTo("EntitiesMovieKeyProjection") val representations = codeGenResult.javaDataTypes.filter { "Representation" in it.typeSpec.name } assertThat(representations).hasSize(2) diff --git a/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapiv2/ClientApiGenFragmentTestv2.kt b/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapiv2/ClientApiGenFragmentTestv2.kt index 480e5f7de..89fc34f5d 100644 --- a/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapiv2/ClientApiGenFragmentTestv2.kt +++ b/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapiv2/ClientApiGenFragmentTestv2.kt @@ -61,12 +61,12 @@ class ClientApiGenFragmentTestv2 { assertThat(codeGenResult.clientProjections.size).isEqualTo(3) assertThat(codeGenResult.clientProjections[0].typeSpec.name).isEqualTo("SearchProjectionRoot") assertThat(codeGenResult.clientProjections[0].typeSpec.methodSpecs).extracting("name").contains("title") - assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieProjection") + assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieFragmentProjection") assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").contains("duration") assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").contains("title") assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name") .doesNotContain("episodes") - assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("SeriesProjection") + assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("SeriesFragmentProjection") assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").contains("episodes") assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").contains("title") assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name") @@ -116,12 +116,12 @@ class ClientApiGenFragmentTestv2 { assertThat(codeGenResult.clientProjections[0].typeSpec.name).isEqualTo("SearchProjectionRoot") assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("ShowProjection") assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").contains("title") - assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("MovieProjection") + assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("MovieFragmentProjection") assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").contains("duration") assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").contains("title") assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name") .doesNotContain("episodes") - assertThat(codeGenResult.clientProjections[3].typeSpec.name).isEqualTo("SeriesProjection") + assertThat(codeGenResult.clientProjections[3].typeSpec.name).isEqualTo("SeriesFragmentProjection") assertThat(codeGenResult.clientProjections[3].typeSpec.methodSpecs).extracting("name").contains("episodes") assertThat(codeGenResult.clientProjections[3].typeSpec.methodSpecs).extracting("name").contains("title") assertThat(codeGenResult.clientProjections[3].typeSpec.methodSpecs).extracting("name") @@ -162,10 +162,10 @@ class ClientApiGenFragmentTestv2 { assertThat(codeGenResult.clientProjections[0].typeSpec.name).isEqualTo("SearchProjectionRoot") assertThat(codeGenResult.clientProjections[0].typeSpec.methodSpecs).extracting("name").contains("onMovie") assertThat(codeGenResult.clientProjections[0].typeSpec.methodSpecs).extracting("name").contains("onActor") - assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieProjection") + assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieFragmentProjection") assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").contains("title") assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").doesNotContain("name") - assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("ActorProjection") + assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("ActorFragmentProjection") assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").contains("name") assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").doesNotContain("title") @@ -174,6 +174,52 @@ class ClientApiGenFragmentTestv2 { ) } + @Test + fun unionFragmentSharingSubProjection() { + val schema = """ + type Query { + search: [Result] + actor: Actor + } + + union Result = Movie | Actor + + type Movie { + title: String + } + + type Actor { + name: String + } + """.trimIndent() + + val codeGenResult = CodeGen( + CodeGenConfig( + schemas = setOf(schema), + packageName = basePackageName, + generateClientApiv2 = true + ) + ).generate() + + assertThat(codeGenResult.clientProjections.size).isEqualTo(4) + assertThat(codeGenResult.clientProjections[0].typeSpec.name).isEqualTo("SearchProjectionRoot") + assertThat(codeGenResult.clientProjections[0].typeSpec.methodSpecs).extracting("name").contains("onMovie") + assertThat(codeGenResult.clientProjections[0].typeSpec.methodSpecs).extracting("name").contains("onActor") + assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieFragmentProjection") + assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").contains("title") + assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").doesNotContain("name") + assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("ActorFragmentProjection") + assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").contains("name") + assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").doesNotContain("title") + assertThat(codeGenResult.clientProjections[3].typeSpec.name).isEqualTo("ActorProjectionRoot") + assertThat(codeGenResult.clientProjections[3].typeSpec.methodSpecs).extracting("name").contains("name") + assertThat(codeGenResult.clientProjections[3].typeSpec.methodSpecs).extracting("name").doesNotContain("title") + + assertCompilesJava( + codeGenResult.clientProjections + codeGenResult.javaQueryTypes + codeGenResult.javaEnumTypes + codeGenResult.javaDataTypes + codeGenResult.javaInterfaces + ) + } + @Test fun unionFragmentOnSubType() { val schema = """ @@ -212,10 +258,10 @@ class ClientApiGenFragmentTestv2 { assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").doesNotContain("name") assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").contains("onMovie") assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs).extracting("name").contains("onActor") - assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("MovieProjection") + assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("MovieFragmentProjection") assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").contains("title") assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs).extracting("name").doesNotContain("name") - assertThat(codeGenResult.clientProjections[3].typeSpec.name).isEqualTo("ActorProjection") + assertThat(codeGenResult.clientProjections[3].typeSpec.name).isEqualTo("ActorFragmentProjection") assertThat(codeGenResult.clientProjections[3].typeSpec.methodSpecs).extracting("name").contains("name") assertThat(codeGenResult.clientProjections[3].typeSpec.methodSpecs).extracting("name").doesNotContain("title") diff --git a/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapiv2/ClientApiGenProjectionTestv2.kt b/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapiv2/ClientApiGenProjectionTestv2.kt index 49f60fbba..54a6d0b4c 100644 --- a/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapiv2/ClientApiGenProjectionTestv2.kt +++ b/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapiv2/ClientApiGenProjectionTestv2.kt @@ -118,7 +118,7 @@ class ClientApiGenProjectionTestv2 { assertThat(codeGenResult.clientProjections.size).isEqualTo(4) assertThat(codeGenResult.clientProjections[0].typeSpec.name).isEqualTo("SearchProjectionRoot") - assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieProjection") + assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieFragmentProjection") assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("DetailsProjection") assertThat(codeGenResult.clientProjections[3].typeSpec.name).isEqualTo("ShowProjection") @@ -162,8 +162,8 @@ class ClientApiGenProjectionTestv2 { assertThat(codeGenResult.clientProjections.size).isEqualTo(5) assertThat(codeGenResult.clientProjections[0].typeSpec.name).isEqualTo("SearchProjectionRoot") - assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("ShowProjection") - assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("MovieProjection") + assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("ShowFragmentProjection") + assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("MovieFragmentProjection") assertThat(codeGenResult.clientProjections[3].typeSpec.name).isEqualTo("RelatedProjection") assertThat(codeGenResult.clientProjections[4].typeSpec.name).isEqualTo("VideoProjection") diff --git a/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapiv2/ClientApiGenQueryTestv2.kt b/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapiv2/ClientApiGenQueryTestv2.kt index 32ced2daf..5d082b85f 100644 --- a/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapiv2/ClientApiGenQueryTestv2.kt +++ b/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapiv2/ClientApiGenQueryTestv2.kt @@ -210,8 +210,8 @@ class ClientApiGenQueryTestv2 { assertThat(codeGenResult.clientProjections) .extracting("typeSpec").extracting("name").containsExactly( "ShowsProjectionRoot", - "ShowProjection", - "MovieProjection", + "ShowFragmentProjection", + "MovieFragmentProjection", "RelatedProjection", "VideoProjection" ) @@ -442,9 +442,9 @@ class ClientApiGenQueryTestv2 { assertThat(codeGenResult.clientProjections.size).isEqualTo(3) assertThat(codeGenResult.clientProjections[0].typeSpec.name).isEqualTo("SearchProjectionRoot") assertThat(codeGenResult.clientProjections[0].typeSpec.methodSpecs[1].name).isEqualTo("title") - assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieProjection") + assertThat(codeGenResult.clientProjections[1].typeSpec.name).isEqualTo("MovieFragmentProjection") assertThat(codeGenResult.clientProjections[1].typeSpec.methodSpecs[2].name).isEqualTo("duration") - assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("SeriesProjection") + assertThat(codeGenResult.clientProjections[2].typeSpec.name).isEqualTo("SeriesFragmentProjection") assertThat(codeGenResult.clientProjections[2].typeSpec.methodSpecs[2].name).isEqualTo("episodes") assertCompilesJava(