From 8fbec9d3a40f7374e5e89c059c4924a8fdb4cc2c Mon Sep 17 00:00:00 2001 From: Dariusz Kuc Date: Thu, 13 Jan 2022 20:44:35 -0600 Subject: [PATCH] [client] support @include and @skip directives (#1341) --- .../types/generateGraphQLObjectTypeSpec.kt | 4 +- .../generator/types/generatePropertySpecs.kt | 7 +- .../generator/types/generateTypeName.kt | 9 ++- .../IncludeSkipDirectivesQuery.graphql | 6 ++ .../IncludeSkipDirectivesQuery.kt | 42 +++++++++++ .../enums/CustomEnum.kt | 36 +++++++++ .../ScalarWrapper.kt | 15 ++++ .../generator/input_lists/InputListQuery.kt | 2 +- .../scalaraliasquery/ScalarWrapper.kt | 2 +- .../customscalarquery/ScalarWrapper.kt | 4 +- .../complexobjectquery/ComplexObject.kt | 2 +- .../firstquery/ComplexObject.kt | 2 +- .../firstquery/ScalarWrapper.kt | 4 +- .../secondquery/ScalarWrapper.kt | 4 +- .../complexobjectquery/ComplexObject.kt | 2 +- .../skip_include/build.gradle.kts | 73 +++++++++++++++++++ .../skip_include/settings.gradle.kts | 1 + .../expediagroup/directives/Application.kt | 11 +++ .../expediagroup/directives/SimpleQuery.kt | 11 +++ .../src/main/resources/application.yml | 3 + .../directives/ApplicationTest.kt | 52 +++++++++++++ .../test/resources/IncludeSkipQuery.graphql | 5 ++ 22 files changed, 282 insertions(+), 15 deletions(-) create mode 100644 plugins/client/graphql-kotlin-client-generator/src/test/data/generator/include_skip_directives/IncludeSkipDirectivesQuery.graphql create mode 100644 plugins/client/graphql-kotlin-client-generator/src/test/data/generator/include_skip_directives/IncludeSkipDirectivesQuery.kt create mode 100644 plugins/client/graphql-kotlin-client-generator/src/test/data/generator/include_skip_directives/enums/CustomEnum.kt create mode 100644 plugins/client/graphql-kotlin-client-generator/src/test/data/generator/include_skip_directives/includeskipdirectivesquery/ScalarWrapper.kt create mode 100644 plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/build.gradle.kts create mode 100644 plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/settings.gradle.kts create mode 100644 plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/main/kotlin/com/expediagroup/directives/Application.kt create mode 100644 plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/main/kotlin/com/expediagroup/directives/SimpleQuery.kt create mode 100644 plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/main/resources/application.yml create mode 100644 plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/test/kotlin/com/expediagroup/directives/ApplicationTest.kt create mode 100644 plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/test/resources/IncludeSkipQuery.graphql diff --git a/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generateGraphQLObjectTypeSpec.kt b/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generateGraphQLObjectTypeSpec.kt index 9fbf74ee80..23d5b3dd79 100644 --- a/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generateGraphQLObjectTypeSpec.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generateGraphQLObjectTypeSpec.kt @@ -68,7 +68,9 @@ internal fun generateGraphQLObjectTypeSpec( val constructorParameter = ParameterSpec.builder(propertySpec.name, propertySpec.type) val className = propertySpec.type as? ClassName - if (className != null && context.enumClassToTypeSpecs.keys.contains(className)) { + if (propertySpec.type.isNullable) { + constructorParameter.defaultValue("null") + } else if (className != null && context.enumClassToTypeSpecs.keys.contains(className)) { constructorParameter.defaultValue("%T.%N", className, className.member(UNKNOWN_VALUE)) } constructorBuilder.addParameter(constructorParameter.build()) diff --git a/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generatePropertySpecs.kt b/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generatePropertySpecs.kt index b379354bf8..18241b8cbd 100755 --- a/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generatePropertySpecs.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generatePropertySpecs.kt @@ -30,6 +30,8 @@ import com.squareup.kotlinpoet.ParameterizedTypeName import com.squareup.kotlinpoet.PropertySpec import com.squareup.kotlinpoet.TypeName import graphql.Directives.DeprecatedDirective +import graphql.Directives.IncludeDirective +import graphql.Directives.SkipDirective import graphql.language.Field import graphql.language.FieldDefinition import graphql.language.NonNullType @@ -59,7 +61,10 @@ internal fun generatePropertySpecs( throw MissingArgumentException(context.operationName, objectName, selectedField.name, missingRequiredArguments) } - val kotlinFieldType = generateTypeName(context, fieldDefinition.type, selectedField.selectionSet) + val optional = selectedField.directives.any { + it.name == SkipDirective.name || it.name == IncludeDirective.name + } + val kotlinFieldType = generateTypeName(context, fieldDefinition.type, selectedField.selectionSet, optional = optional) val fieldName = selectedField.alias ?: fieldDefinition.name val propertySpecBuilder = PropertySpec.builder(fieldName, kotlinFieldType) diff --git a/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generateTypeName.kt b/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generateTypeName.kt index c4524546e5..bb0a1db2b7 100644 --- a/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generateTypeName.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generateTypeName.kt @@ -51,8 +51,13 @@ import kotlinx.serialization.Serializable /** * Generate [TypeName] reference to a Kotlin class representation of an underlying GraphQL type. */ -internal fun generateTypeName(context: GraphQLClientGeneratorContext, graphQLType: Type<*>, selectionSet: SelectionSet? = null): TypeName { - val nullable = graphQLType !is NonNullType +internal fun generateTypeName( + context: GraphQLClientGeneratorContext, + graphQLType: Type<*>, + selectionSet: SelectionSet? = null, + optional: Boolean = false +): TypeName { + val nullable = optional || graphQLType !is NonNullType return when (graphQLType) { is NonNullType -> generateTypeName(context, graphQLType.type, selectionSet) diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/include_skip_directives/IncludeSkipDirectivesQuery.graphql b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/include_skip_directives/IncludeSkipDirectivesQuery.graphql new file mode 100644 index 0000000000..63bff877a0 --- /dev/null +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/include_skip_directives/IncludeSkipDirectivesQuery.graphql @@ -0,0 +1,6 @@ +query IncludeSkipDirectivesQuery($includeCondition: Boolean!, $skipCondition: Boolean!) { + enumQuery @include(if: $includeCondition) + scalarQuery @skip(if: $skipCondition) { + count + } +} diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/include_skip_directives/IncludeSkipDirectivesQuery.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/include_skip_directives/IncludeSkipDirectivesQuery.kt new file mode 100644 index 0000000000..c6ad01969d --- /dev/null +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/include_skip_directives/IncludeSkipDirectivesQuery.kt @@ -0,0 +1,42 @@ +package com.expediagroup.graphql.generated + +import com.expediagroup.graphql.client.Generated +import com.expediagroup.graphql.client.types.GraphQLClientRequest +import com.expediagroup.graphql.generated.enums.CustomEnum +import com.expediagroup.graphql.generated.includeskipdirectivesquery.ScalarWrapper +import kotlin.Boolean +import kotlin.String +import kotlin.reflect.KClass + +public const val INCLUDE_SKIP_DIRECTIVES_QUERY: String = + "query IncludeSkipDirectivesQuery(${'$'}includeCondition: Boolean!, ${'$'}skipCondition: Boolean!) {\n enumQuery @include(if: ${'$'}includeCondition)\n scalarQuery @skip(if: ${'$'}skipCondition) {\n count\n }\n}" + +@Generated +public class IncludeSkipDirectivesQuery( + public override val variables: IncludeSkipDirectivesQuery.Variables +) : GraphQLClientRequest { + public override val query: String = INCLUDE_SKIP_DIRECTIVES_QUERY + + public override val operationName: String = "IncludeSkipDirectivesQuery" + + public override fun responseType(): KClass = + IncludeSkipDirectivesQuery.Result::class + + @Generated + public data class Variables( + public val includeCondition: Boolean, + public val skipCondition: Boolean + ) + + @Generated + public data class Result( + /** + * Query that returns enum value + */ + public val enumQuery: CustomEnum? = null, + /** + * Query that returns wrapper object with all supported scalar types + */ + public val scalarQuery: ScalarWrapper? = null + ) +} diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/include_skip_directives/enums/CustomEnum.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/include_skip_directives/enums/CustomEnum.kt new file mode 100644 index 0000000000..fdea6b1ba1 --- /dev/null +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/include_skip_directives/enums/CustomEnum.kt @@ -0,0 +1,36 @@ +package com.expediagroup.graphql.generated.enums + +import com.expediagroup.graphql.client.Generated +import com.fasterxml.jackson.`annotation`.JsonEnumDefaultValue +import com.fasterxml.jackson.`annotation`.JsonProperty +import kotlin.Deprecated + +/** + * Custom enum description + */ +@Generated +public enum class CustomEnum { + /** + * First enum value + */ + ONE, + /** + * Third enum value + */ + @Deprecated(message = "only goes up to two") + THREE, + /** + * Second enum value + */ + TWO, + /** + * Lowercase enum value + */ + @JsonProperty("four") + FOUR, + /** + * This is a default enum value that will be used when attempting to deserialize unknown value. + */ + @JsonEnumDefaultValue + __UNKNOWN_VALUE, +} diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/include_skip_directives/includeskipdirectivesquery/ScalarWrapper.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/include_skip_directives/includeskipdirectivesquery/ScalarWrapper.kt new file mode 100644 index 0000000000..70bb1e2e88 --- /dev/null +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/include_skip_directives/includeskipdirectivesquery/ScalarWrapper.kt @@ -0,0 +1,15 @@ +package com.expediagroup.graphql.generated.includeskipdirectivesquery + +import com.expediagroup.graphql.client.Generated +import kotlin.Int + +/** + * Wrapper that holds all supported scalar types + */ +@Generated +public data class ScalarWrapper( + /** + * A signed 32-bit nullable integer value + */ + public val count: Int? = null +) diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/input_lists/InputListQuery.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/input_lists/InputListQuery.kt index f5a08da3e8..9137afc7fc 100644 --- a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/input_lists/InputListQuery.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/input_lists/InputListQuery.kt @@ -31,6 +31,6 @@ public class InputListQuery( /** * Query accepting list input */ - public val listInputQuery: String? + public val listInputQuery: String? = null ) } diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/scalar_typealias/scalaraliasquery/ScalarWrapper.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/scalar_typealias/scalaraliasquery/ScalarWrapper.kt index 20a0116151..c7959bc4b3 100644 --- a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/scalar_typealias/scalaraliasquery/ScalarWrapper.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/scalar_typealias/scalaraliasquery/ScalarWrapper.kt @@ -16,5 +16,5 @@ public data class ScalarWrapper( /** * Custom scalar of UUID */ - public val custom: UUID? + public val custom: UUID? = null ) diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/jackson/custom_scalars/customscalarquery/ScalarWrapper.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/jackson/custom_scalars/customscalarquery/ScalarWrapper.kt index ca4f5bb671..3fd5ff3e4d 100644 --- a/plugins/client/graphql-kotlin-client-generator/src/test/data/jackson/custom_scalars/customscalarquery/ScalarWrapper.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/jackson/custom_scalars/customscalarquery/ScalarWrapper.kt @@ -21,13 +21,13 @@ public data class ScalarWrapper( */ @JsonSerialize(converter = UUIDToAnyConverter::class) @JsonDeserialize(converter = AnyToUUIDConverter::class) - public val custom: UUID?, + public val custom: UUID? = null, /** * List of custom scalar UUIDs */ @JsonSerialize(contentConverter = UUIDToAnyConverter::class) @JsonDeserialize(contentConverter = AnyToUUIDConverter::class) - public val customList: List?, + public val customList: List? = null, /** * Custom scalar of Locale */ diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/jackson/object/complexobjectquery/ComplexObject.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/jackson/object/complexobjectquery/ComplexObject.kt index b9951d42de..d1eb158de1 100644 --- a/plugins/client/graphql-kotlin-client-generator/src/test/data/jackson/object/complexobjectquery/ComplexObject.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/jackson/object/complexobjectquery/ComplexObject.kt @@ -23,7 +23,7 @@ public data class ComplexObject( * Optional value * Second line of the description */ - public val optional: String?, + public val optional: String? = null, /** * Some additional details */ diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/multiple_queries/firstquery/ComplexObject.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/multiple_queries/firstquery/ComplexObject.kt index 3fcbe6a423..6beeb9c7a8 100644 --- a/plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/multiple_queries/firstquery/ComplexObject.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/multiple_queries/firstquery/ComplexObject.kt @@ -25,7 +25,7 @@ public data class ComplexObject( * Optional value * Second line of the description */ - public val optional: String?, + public val optional: String? = null, /** * Some additional details */ diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/multiple_queries/firstquery/ScalarWrapper.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/multiple_queries/firstquery/ScalarWrapper.kt index 2db254dfb1..9a894b92bb 100644 --- a/plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/multiple_queries/firstquery/ScalarWrapper.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/multiple_queries/firstquery/ScalarWrapper.kt @@ -16,12 +16,12 @@ public data class ScalarWrapper( /** * A signed 32-bit nullable integer value */ - public val count: Int?, + public val count: Int? = null, /** * Custom scalar of UUID */ @Serializable(with = UUIDSerializer::class) - public val custom: UUID?, + public val custom: UUID? = null, /** * ID represents unique identifier that is not intended to be human readable */ diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/multiple_queries/secondquery/ScalarWrapper.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/multiple_queries/secondquery/ScalarWrapper.kt index 7fb04010a2..b9dd23425b 100644 --- a/plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/multiple_queries/secondquery/ScalarWrapper.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/multiple_queries/secondquery/ScalarWrapper.kt @@ -16,12 +16,12 @@ public data class ScalarWrapper( /** * A signed 32-bit nullable integer value */ - public val count: Int?, + public val count: Int? = null, /** * Custom scalar of UUID */ @Serializable(with = UUIDSerializer::class) - public val custom: UUID?, + public val custom: UUID? = null, /** * ID represents unique identifier that is not intended to be human readable */ diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/object/complexobjectquery/ComplexObject.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/object/complexobjectquery/ComplexObject.kt index 9dcf5efb54..807fa1b4a1 100644 --- a/plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/object/complexobjectquery/ComplexObject.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/object/complexobjectquery/ComplexObject.kt @@ -25,7 +25,7 @@ public data class ComplexObject( * Optional value * Second line of the description */ - public val optional: String?, + public val optional: String? = null, /** * Some additional details */ diff --git a/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/build.gradle.kts b/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/build.gradle.kts new file mode 100644 index 0000000000..673d3a55cd --- /dev/null +++ b/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/build.gradle.kts @@ -0,0 +1,73 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import com.expediagroup.graphql.plugin.gradle.tasks.GraphQLGenerateSDLTask +import com.expediagroup.graphql.plugin.gradle.tasks.GraphQLGenerateTestClientTask + +buildscript { + repositories { + mavenLocal { + content { + includeGroup("com.expediagroup") + } + } + } + + val graphQLKotlinVersion = System.getenv("GRAPHQL_KOTLIN_VERSION") ?: "5.0.0-SNAPSHOT" + dependencies { + classpath("com.expediagroup:graphql-kotlin-gradle-plugin:$graphQLKotlinVersion") + } +} + +plugins { + id("org.springframework.boot") version "2.5.5" + kotlin("jvm") version "1.5.31" + kotlin("plugin.spring") version "1.5.31" +} + +apply(plugin = "com.expediagroup.graphql") + +group = "com.expediagroup" +version = "0.0.1-SNAPSHOT" + +repositories { + mavenCentral() + mavenLocal { + content { + includeGroup("com.expediagroup") + } + } +} + +val graphQLKotlinVersion = System.getenv("GRAPHQL_KOTLIN_VERSION") ?: "5.0.0-SNAPSHOT" +val icuVersion = System.getenv("ICU_VERSION") ?: "69.1" +val junitVersion = System.getenv("JUNIT_VERSION") ?: "5.7.2" +val kotlinVersion = System.getenv("KOTLIN_VERSION") ?: "1.5.31" +val springBootVersion = System.getenv("SPRINGBOOT_VERSION") ?: "2.5.5" +dependencies { + implementation("com.expediagroup:graphql-kotlin-hooks-provider:$graphQLKotlinVersion") + implementation("com.expediagroup:graphql-kotlin-spring-client:$graphQLKotlinVersion") + implementation("com.expediagroup:graphql-kotlin-spring-server:$graphQLKotlinVersion") + implementation("com.ibm.icu:icu4j:$icuVersion") + testImplementation(kotlin("test-junit5", kotlinVersion)) + testImplementation("org.junit.jupiter:junit-jupiter-api:$junitVersion") + testImplementation("org.junit.jupiter:junit-jupiter-engine:$junitVersion") + testImplementation("org.springframework.boot:spring-boot-starter-test:$springBootVersion") +} + +tasks.withType { + kotlinOptions { + freeCompilerArgs = listOf("-Xjsr305=strict") + jvmTarget = "11" + } +} + +tasks.withType { + useJUnitPlatform() +} + +val graphqlGenerateSDL by tasks.getting(GraphQLGenerateSDLTask::class) { + packages.set(listOf("com.expediagroup.directives")) +} +val graphqlGenerateTestClient by tasks.getting(GraphQLGenerateTestClientTask::class) { + packageName.set("com.expediagroup.directives.generated") + schemaFile.set(graphqlGenerateSDL.schemaFile) +} diff --git a/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/settings.gradle.kts b/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/settings.gradle.kts new file mode 100644 index 0000000000..d5f6a59478 --- /dev/null +++ b/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "include-skip-test" diff --git a/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/main/kotlin/com/expediagroup/directives/Application.kt b/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/main/kotlin/com/expediagroup/directives/Application.kt new file mode 100644 index 0000000000..60b0232c6d --- /dev/null +++ b/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/main/kotlin/com/expediagroup/directives/Application.kt @@ -0,0 +1,11 @@ +package com.expediagroup.directives + +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication + +@SpringBootApplication +class Application + +fun main(args: Array) { + runApplication(*args) +} diff --git a/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/main/kotlin/com/expediagroup/directives/SimpleQuery.kt b/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/main/kotlin/com/expediagroup/directives/SimpleQuery.kt new file mode 100644 index 0000000000..71f5e4a7b0 --- /dev/null +++ b/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/main/kotlin/com/expediagroup/directives/SimpleQuery.kt @@ -0,0 +1,11 @@ +package com.expediagroup.directives + +import com.expediagroup.graphql.server.operations.Query +import org.springframework.stereotype.Component +import java.util.UUID + +@Component +class SimpleQuery : Query { + + fun simpleQuery(): String = UUID.randomUUID().toString() +} diff --git a/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/main/resources/application.yml b/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/main/resources/application.yml new file mode 100644 index 0000000000..27076cd49f --- /dev/null +++ b/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/main/resources/application.yml @@ -0,0 +1,3 @@ +graphql: + packages: + - "com.expediagroup.directives" diff --git a/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/test/kotlin/com/expediagroup/directives/ApplicationTest.kt b/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/test/kotlin/com/expediagroup/directives/ApplicationTest.kt new file mode 100644 index 0000000000..89a37c6649 --- /dev/null +++ b/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/test/kotlin/com/expediagroup/directives/ApplicationTest.kt @@ -0,0 +1,52 @@ +package com.expediagroup.directives + +import com.expediagroup.directives.generated.IncludeSkipQuery +import com.expediagroup.graphql.client.spring.GraphQLWebClient +import kotlinx.coroutines.runBlocking +import org.junit.jupiter.api.Test +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.boot.web.server.LocalServerPort +import java.util.UUID +import kotlin.test.assertNotNull +import kotlin.test.assertNull + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class ApplicationTest(@LocalServerPort private val port: Int) { + + @Test + fun `verify include and skip directives are honored by client`(): Unit = runBlocking { + val client = GraphQLWebClient(url = "http://localhost:$port/graphql") + + val skippedQuery = IncludeSkipQuery(variables = IncludeSkipQuery.Variables( + includeCondition = false, + skipCondition = true + )) + + val response = client.execute(skippedQuery) + val simpleResponse = response.data?.simpleQuery + assertNotNull(simpleResponse) + assertNotNull(UUID.fromString(simpleResponse)) + + val included = response.data?.included + assertNull(included) + val skipped = response.data?.skipped + assertNull(skipped) + + val includeQuery = IncludeSkipQuery(variables = IncludeSkipQuery.Variables( + includeCondition = true, + skipCondition = false + )) + + val nonNullResponse = client.execute(includeQuery) + val simpleResponseNonNull = nonNullResponse.data?.simpleQuery + assertNotNull(simpleResponseNonNull) + assertNotNull(UUID.fromString(simpleResponseNonNull)) + + val includedNonNull = nonNullResponse.data?.included + assertNotNull(includedNonNull) + assertNotNull(UUID.fromString(includedNonNull)) + val skippedNonNull = nonNullResponse.data?.skipped + assertNotNull(skippedNonNull) + assertNotNull(UUID.fromString(skippedNonNull)) + } +} diff --git a/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/test/resources/IncludeSkipQuery.graphql b/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/test/resources/IncludeSkipQuery.graphql new file mode 100644 index 0000000000..1bd9309150 --- /dev/null +++ b/plugins/graphql-kotlin-gradle-plugin/src/integration/client-generator/skip_include/src/test/resources/IncludeSkipQuery.graphql @@ -0,0 +1,5 @@ +query IncludeSkipQuery($includeCondition: Boolean!, $skipCondition: Boolean!) { + simpleQuery + included: simpleQuery @include(if: $includeCondition) + skipped: simpleQuery @skip(if: $skipCondition) +}