From 337886cf560fc87ace805074c15ac8957cfb6c3d Mon Sep 17 00:00:00 2001 From: Donnie McMahan Date: Wed, 30 Nov 2022 16:45:47 -0600 Subject: [PATCH 1/2] Initialize `GraphQLQuery#name` from generated subclasses --- .../generators/java/ClientApiGenerator.kt | 22 +++++++- .../clientapi/ClientApiGenBuilderTest.kt | 56 +++++++++++++++++++ 2 files changed, 75 insertions(+), 3 deletions(-) diff --git a/graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/generators/java/ClientApiGenerator.kt b/graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/generators/java/ClientApiGenerator.kt index e92361323..8bb6dc96b 100644 --- a/graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/generators/java/ClientApiGenerator.kt +++ b/graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/generators/java/ClientApiGenerator.kt @@ -110,12 +110,12 @@ class ClientApiGenerator(private val config: CodeGenConfig, private val document .addCode( if (it.inputValueDefinitions.isNotEmpty()) { """ - |return new $methodName(${it.inputValueDefinitions.joinToString(", ") { ReservedKeywordSanitizer.sanitize(it.name) }}, fieldsSet); + |return new $methodName(${it.inputValueDefinitions.joinToString(", ") { ReservedKeywordSanitizer.sanitize(it.name) }}, queryName, fieldsSet); | """.trimMargin() } else { """ - |return new $methodName(); + |return new $methodName(queryName); """.trimMargin() } ) @@ -126,7 +126,7 @@ class ClientApiGenerator(private val config: CodeGenConfig, private val document .addModifiers(Modifier.PUBLIC) constructorBuilder.addCode( """ - |super("${operation.lowercase()}"); + |super("${operation.lowercase()}", queryName); | """.trimMargin() ) @@ -170,6 +170,22 @@ class ClientApiGenerator(private val config: CodeGenConfig, private val document } } + val nameMethodBuilder = MethodSpec.methodBuilder("queryName") + .addParameter(String::class.java, "queryName") + .returns(ClassName.get("", "Builder")) + .addModifiers(Modifier.PUBLIC) + .addCode( + """ + |this.queryName = queryName; + |return this; + """.trimMargin() + ) + + builderClass.addField(FieldSpec.builder(String::class.java, "queryName", Modifier.PRIVATE).build()) + .addMethod(nameMethodBuilder.build()) + + constructorBuilder.addParameter(String::class.java, "queryName") + if (it.inputValueDefinitions.size > 0) { constructorBuilder.addParameter(setOfStringType, "fieldsSet") } diff --git a/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapi/ClientApiGenBuilderTest.kt b/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapi/ClientApiGenBuilderTest.kt index 68dbb862a..9ee30a93b 100644 --- a/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapi/ClientApiGenBuilderTest.kt +++ b/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapi/ClientApiGenBuilderTest.kt @@ -82,4 +82,60 @@ class ClientApiGenBuilderTest { assertThat(result2QueryObject.input.keys).isEmpty() assertThat(result2QueryObject.input["nameFilter"]).isNull() } + + @Test + fun `Query name should be null if not set`() { + val schema = """ + type Query { + filter(nameFilter: String): [String] + } + """.trimIndent() + + val codeGenResult = CodeGen( + CodeGenConfig( + schemas = setOf(schema), + packageName = basePackageName, + generateClientApi = true, + maxProjectionDepth = 2 + ) + ).generate() + + val builderClass = assertCompilesJava(codeGenResult).toClassLoader() + .loadClass("$basePackageName.client.FilterGraphQLQuery\$Builder") + val buildMethod = builderClass.getMethod("build") + + val builder = builderClass.constructors[0].newInstance() + val result2QueryObject: GraphQLQuery = buildMethod.invoke(builder) as GraphQLQuery + assertThat(result2QueryObject.name).isNull() + } + + @Test + fun `Query name should be accessible via GraphQLQuery#name if set`() { + val schema = """ + type Query { + filter(nameFilter: String): [String] + } + """.trimIndent() + + val codeGenResult = CodeGen( + CodeGenConfig( + schemas = setOf(schema), + packageName = basePackageName, + generateClientApi = true, + maxProjectionDepth = 2 + ) + ).generate() + + val builderClass = assertCompilesJava(codeGenResult).toClassLoader() + .loadClass("$basePackageName.client.FilterGraphQLQuery\$Builder") + val nameMethod = builderClass.getMethod("queryName", String::class.java) + val buildMethod = builderClass.getMethod("build") + + val builder = builderClass.constructors[0].newInstance() + nameMethod.invoke(builder, "test") + + val result2QueryObject: GraphQLQuery = buildMethod.invoke(builder) as GraphQLQuery + assertThat(result2QueryObject.name).isNotNull + assertThat(result2QueryObject.name).isEqualTo("test") + } } From 02682ae77e66f7e1a1091950eff483e13c5ca13b Mon Sep 17 00:00:00 2001 From: Donnie McMahan Date: Tue, 6 Dec 2022 09:47:51 -0600 Subject: [PATCH 2/2] Fix upstream unit tests --- .../graphql/dgs/codegen/clientapi/ClientApiGenMutationTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapi/ClientApiGenMutationTest.kt b/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapi/ClientApiGenMutationTest.kt index a0620498d..6dbe79db6 100644 --- a/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapi/ClientApiGenMutationTest.kt +++ b/graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/clientapi/ClientApiGenMutationTest.kt @@ -160,7 +160,7 @@ class ClientApiGenMutationTest { .find { it.name == "" }?.code.toString() val expected = """ - |super("mutation"); + |super("mutation", queryName); |if (movie != null || fieldsSet.contains("movie")) { | getInput().put("movie", movie); |}if (reviews != null || fieldsSet.contains("reviews")) { @@ -200,7 +200,7 @@ class ClientApiGenMutationTest { assert( codeGenResult.javaQueryTypes[0].typeSpec.methodSpecs .find { it.name == "" }?.code.toString() - .contains("super(\"mutation\");\ngetInput().put(\"movieId\", movieId);") + .contains("super(\"mutation\", queryName);\ngetInput().put(\"movieId\", movieId);") ) assertCompilesJava(