Skip to content

Commit

Permalink
Merge pull request #549 from Netflix/cole/fix/union-fragment-client
Browse files Browse the repository at this point in the history
fix(ClientApiGenFragmentTestv2.kt): fragment name projection
  • Loading branch information
coleturner authored May 3, 2023
2 parents b60525b + 2f8fa41 commit ffef604
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -402,23 +402,24 @@ 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}<PARENT, ROOT>" else "ROOT"
val parentRef = javaType.build().name
val projectionName = "${it.name.capitalized()}Projection"
val typeVariable = TypeVariableName.get("$projectionName<$parentRef<PARENT, ROOT>, $rootTypeName>")
val projectionName = "${it.name.capitalized()}Fragment"
val fullProjectionName = "${projectionName}Projection"
val typeVariable = TypeVariableName.get("$fullProjectionName<$parentRef<PARENT, ROOT>, $rootTypeName>")
javaType.addMethod(
MethodSpec.methodBuilder("on${it.name}")
.addModifiers(Modifier.PUBLIC)
.returns(typeVariable)
.addCode(
"""
|$projectionName<$parentRef<PARENT, ROOT>, $rootTypeName> fragment = new $projectionName<>(this, $rootRef);
|$fullProjectionName<$parentRef<PARENT, ROOT>, $rootTypeName> fragment = new $fullProjectionName<>(this, $rootRef);
|getFragments().add(fragment);
|return fragment;
""".trimMargin()
)
.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<Pair<String, String>>, queryDepth: Int): CodeGenResult {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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")

Expand All @@ -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 = """
Expand Down Expand Up @@ -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")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")

Expand Down Expand Up @@ -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")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -210,8 +210,8 @@ class ClientApiGenQueryTestv2 {
assertThat(codeGenResult.clientProjections)
.extracting("typeSpec").extracting("name").containsExactly(
"ShowsProjectionRoot",
"ShowProjection",
"MovieProjection",
"ShowFragmentProjection",
"MovieFragmentProjection",
"RelatedProjection",
"VideoProjection"
)
Expand Down Expand Up @@ -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(
Expand Down

0 comments on commit ffef604

Please sign in to comment.