From 6cb906dbd1a56f2b41b6296aec56edf154926362 Mon Sep 17 00:00:00 2001 From: Joe Barnett Date: Thu, 28 Jul 2022 09:00:08 -0700 Subject: [PATCH] Update to graphql-java 19.0 (#1491) FlowSubscriptionExecutionStrategy needs to be updated to pass instrumentationState to instrumentations per https://github.com/graphql-java/graphql-java/pull/2769 ValidationError string changed slightly so adjust assertions. --- .../server/spring/WebTestClientExtensions.kt | 11 ++++++++--- .../server/spring/query/PolymorphicQueryIT.kt | 7 ++++--- .../server/spring/query/SimpleQueryIT.kt | 18 ++++++++++++------ .../FlowSubscriptionExecutionStrategy.kt | 12 +++++++++--- gradle.properties | 2 +- .../server/spring/execution/IntrospectionIT.kt | 4 +++- 6 files changed, 37 insertions(+), 17 deletions(-) diff --git a/examples/server/spring-server/src/test/kotlin/com/expediagroup/graphql/examples/server/spring/WebTestClientExtensions.kt b/examples/server/spring-server/src/test/kotlin/com/expediagroup/graphql/examples/server/spring/WebTestClientExtensions.kt index 5eb4bf194..131956b0f 100644 --- a/examples/server/spring-server/src/test/kotlin/com/expediagroup/graphql/examples/server/spring/WebTestClientExtensions.kt +++ b/examples/server/spring-server/src/test/kotlin/com/expediagroup/graphql/examples/server/spring/WebTestClientExtensions.kt @@ -16,6 +16,7 @@ package com.expediagroup.graphql.examples.server.spring +import org.hamcrest.core.StringContains import org.springframework.test.web.reactive.server.WebTestClient fun WebTestClient.ResponseSpec.verifyOnlyDataExists(expectedQuery: String): WebTestClient.BodyContentSpec { @@ -34,10 +35,14 @@ fun WebTestClient.ResponseSpec.verifyData( .jsonPath("$DATA_JSON_PATH.$expectedQuery").isEqualTo(expectedData) } -fun WebTestClient.ResponseSpec.verifyError(expectedError: String): WebTestClient.BodyContentSpec { +fun WebTestClient.ResponseSpec.verifyError(expectedErrorSubString: String): WebTestClient.BodyContentSpec { return this.expectStatus().isOk .expectBody() - .jsonPath(DATA_JSON_PATH).doesNotExist() - .jsonPath("$ERRORS_JSON_PATH.[0].message").isEqualTo(expectedError) + .verifyError(expectedErrorSubString) +} + +fun WebTestClient.BodyContentSpec.verifyError(expectedErrorSubString: String): WebTestClient.BodyContentSpec { + return this.jsonPath(DATA_JSON_PATH).doesNotExist() + .jsonPath("$ERRORS_JSON_PATH.[0].message").value(StringContains.containsString(expectedErrorSubString)) .jsonPath(EXTENSIONS_JSON_PATH).doesNotExist() } diff --git a/examples/server/spring-server/src/test/kotlin/com/expediagroup/graphql/examples/server/spring/query/PolymorphicQueryIT.kt b/examples/server/spring-server/src/test/kotlin/com/expediagroup/graphql/examples/server/spring/query/PolymorphicQueryIT.kt index 9b4646406..eaddaf885 100644 --- a/examples/server/spring-server/src/test/kotlin/com/expediagroup/graphql/examples/server/spring/query/PolymorphicQueryIT.kt +++ b/examples/server/spring-server/src/test/kotlin/com/expediagroup/graphql/examples/server/spring/query/PolymorphicQueryIT.kt @@ -81,10 +81,11 @@ class PolymorphicQueryIT(@Autowired private val testClient: WebTestClient) { .bodyValue("query { $query(type: $unknownType) { type, sound } }") .exchange() .expectStatus().isOk + .verifyError("Validation error") + .verifyError("WrongType") .verifyError( - "Validation error of type WrongType: " + - "argument 'type' with value 'EnumValue{name='$unknownType'}' is not a valid 'AnimalType' - " + - "Expected enum literal value not in allowable values - 'EnumValue{name='HELLO'}'. @ 'animal'" + "argument 'type' with value 'EnumValue{name='$unknownType'}' is not a valid 'AnimalType' - " + + "Expected enum literal value not in allowable values - 'EnumValue{name='HELLO'}'" ) } diff --git a/examples/server/spring-server/src/test/kotlin/com/expediagroup/graphql/examples/server/spring/query/SimpleQueryIT.kt b/examples/server/spring-server/src/test/kotlin/com/expediagroup/graphql/examples/server/spring/query/SimpleQueryIT.kt index 4d8d85bf5..adeb0a92f 100644 --- a/examples/server/spring-server/src/test/kotlin/com/expediagroup/graphql/examples/server/spring/query/SimpleQueryIT.kt +++ b/examples/server/spring-server/src/test/kotlin/com/expediagroup/graphql/examples/server/spring/query/SimpleQueryIT.kt @@ -73,8 +73,9 @@ class SimpleQueryIT(@Autowired private val testClient: WebTestClient) { @Test fun `verify notPartOfSchema query`() { val query = "notPartOfSchema" - val expectedError = "Validation error of type FieldUndefined: " + - "Field 'notPartOfSchema' in type 'Query' is undefined @ 'notPartOfSchema'" + val expectedErrorOne = "Validation error" + val expectedErrorTwo = "FieldUndefined" + val expectedErrorThree = "Field 'notPartOfSchema' in type 'Query' is undefined" testClient.post() .uri(GRAPHQL_ENDPOINT) @@ -82,14 +83,17 @@ class SimpleQueryIT(@Autowired private val testClient: WebTestClient) { .contentType(GRAPHQL_MEDIA_TYPE) .bodyValue("query { $query }") .exchange() - .verifyError(expectedError) + .verifyError(expectedErrorOne) + .verifyError(expectedErrorTwo) + .verifyError(expectedErrorThree) } @Test fun `verify privateFunctionsAreNotVisible query`() { val query = "privateFunctionsAreNotVisible" - val expectedError = "Validation error of type FieldUndefined: " + - "Field 'privateFunctionsAreNotVisible' in type 'Query' is undefined @ 'privateFunctionsAreNotVisible'" + val expectedErrorOne = "Validation error" + val expectedErrorTwo = "FieldUndefined" + val expectedErrorThree = "Field 'privateFunctionsAreNotVisible' in type 'Query' is undefined" testClient.post() .uri(GRAPHQL_ENDPOINT) @@ -97,7 +101,9 @@ class SimpleQueryIT(@Autowired private val testClient: WebTestClient) { .contentType(GRAPHQL_MEDIA_TYPE) .bodyValue("query { $query }") .exchange() - .verifyError(expectedError) + .verifyError(expectedErrorOne) + .verifyError(expectedErrorTwo) + .verifyError(expectedErrorThree) } @Test diff --git a/generator/graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/execution/FlowSubscriptionExecutionStrategy.kt b/generator/graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/execution/FlowSubscriptionExecutionStrategy.kt index 01f82ecb5..a92cf0a04 100644 --- a/generator/graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/execution/FlowSubscriptionExecutionStrategy.kt +++ b/generator/graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/execution/FlowSubscriptionExecutionStrategy.kt @@ -25,6 +25,8 @@ import graphql.execution.ExecutionStrategy import graphql.execution.ExecutionStrategyParameters import graphql.execution.SimpleDataFetcherExceptionHandler import graphql.execution.SubscriptionExecutionStrategy +import graphql.execution.instrumentation.ExecutionStrategyInstrumentationContext +import graphql.execution.instrumentation.SimpleInstrumentationContext import graphql.execution.instrumentation.parameters.InstrumentationExecutionParameters import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters @@ -55,7 +57,9 @@ class FlowSubscriptionExecutionStrategy(dfe: DataFetcherExceptionHandler) : Exec val instrumentation = executionContext.instrumentation val instrumentationParameters = InstrumentationExecutionStrategyParameters(executionContext, parameters) - val executionStrategyCtx = instrumentation.beginExecutionStrategy(instrumentationParameters) + val executionStrategyCtx = ExecutionStrategyInstrumentationContext.nonNullCtx( + instrumentation.beginExecutionStrategy(instrumentationParameters, executionContext.instrumentationState) + ) val sourceEventStream = createSourceEventStream(executionContext, parameters) @@ -142,7 +146,9 @@ class FlowSubscriptionExecutionStrategy(dfe: DataFetcherExceptionHandler) : Exec val subscribedFieldStepInfo = createSubscribedFieldStepInfo(executionContext, newParameters) val i13nFieldParameters = InstrumentationFieldParameters(executionContext) { subscribedFieldStepInfo } - val subscribedFieldCtx = instrumentation.beginSubscribedFieldEvent(i13nFieldParameters) + val subscribedFieldCtx = SimpleInstrumentationContext.nonNullCtx( + instrumentation.beginSubscribedFieldEvent(i13nFieldParameters, executionContext.instrumentationState) + ) val fetchedValue = unboxPossibleDataFetcherResult(newExecutionContext, parameters, eventPayload) @@ -161,7 +167,7 @@ class FlowSubscriptionExecutionStrategy(dfe: DataFetcherExceptionHandler) : Exec ) return overallResult.thenCompose { executionResult -> - instrumentation.instrumentExecutionResult(executionResult, i13ExecutionParameters) + instrumentation.instrumentExecutionResult(executionResult, i13ExecutionParameters, executionContext.instrumentationState) } } diff --git a/gradle.properties b/gradle.properties index 314ccfb8c..138246fb4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ kotlinxSerializationVersion = 1.3.2 androidPluginVersion = 7.1.2 classGraphVersion = 4.8.143 federationGraphQLVersion = 0.9.0 -graphQLJavaVersion = 18.0 +graphQLJavaVersion = 19.0 graphQLJavaDataLoaderVersion = 3.1.3 jacksonVersion = 2.13.2 kotlinPoetVersion = 1.11.0 diff --git a/servers/graphql-kotlin-spring-server/src/test/kotlin/com/expediagroup/graphql/server/spring/execution/IntrospectionIT.kt b/servers/graphql-kotlin-spring-server/src/test/kotlin/com/expediagroup/graphql/server/spring/execution/IntrospectionIT.kt index c62288be2..cfe3a3da0 100644 --- a/servers/graphql-kotlin-spring-server/src/test/kotlin/com/expediagroup/graphql/server/spring/execution/IntrospectionIT.kt +++ b/servers/graphql-kotlin-spring-server/src/test/kotlin/com/expediagroup/graphql/server/spring/execution/IntrospectionIT.kt @@ -18,6 +18,7 @@ package com.expediagroup.graphql.server.spring.execution import com.expediagroup.graphql.server.operations.Query import com.expediagroup.graphql.server.types.GraphQLRequest import graphql.introspection.IntrospectionQuery +import org.hamcrest.core.StringContains import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.EnableAutoConfiguration @@ -50,7 +51,8 @@ class IntrospectionIT(@Autowired private val testClient: WebTestClient) { .expectBody() .jsonPath("$.data").doesNotExist() .jsonPath("$.errors").isArray - .jsonPath("$.errors[0].message").isEqualTo("Validation error of type FieldUndefined: Field 'queryType' in type '__Schema' is undefined @ '__schema/queryType'") + .jsonPath("$.errors[0].message").value(StringContains.containsString("Validation error")) + .jsonPath("$.errors[0].message").value(StringContains.containsString("Field 'queryType' in type '__Schema' is undefined")) } @Configuration