Fix dropping of extensions in ContextDataFetcherDecorator

ContextDataFetcherDecorator was not retaining extensions for DataFetchers returning
a DataFetcherResult instance.

Closes gh-1199

Signed-off-by: Patrick Strawderman <pstrawderman@netflix.com>
[brian.clozel@broadcom.com: apply code conventions]
Signed-off-by: Brian Clozel <brian.clozel@broadcom.com>
This commit is contained in:
Patrick Strawderman
2025-04-30 11:47:19 -07:00
committed by Brian Clozel
parent ccf9f8ab7f
commit d30429fe86
2 changed files with 18 additions and 5 deletions

View File

@@ -87,11 +87,7 @@ final class ContextDataFetcherDecorator implements DataFetcher<Object> {
Object value = snapshot.wrap(() -> this.delegate.get(env)).call();
if (value instanceof DataFetcherResult<?> dataFetcherResult) {
Object adapted = updateValue(dataFetcherResult.getData(), snapshot, graphQlContext);
value = DataFetcherResult.newResult()
.data(adapted)
.errors(dataFetcherResult.getErrors())
.localContext(dataFetcherResult.getLocalContext()).build();
value = dataFetcherResult.map((data) -> updateValue(data, snapshot, graphQlContext));
}
else {
value = updateValue(value, snapshot, graphQlContext);

View File

@@ -19,6 +19,7 @@ package org.springframework.graphql.execution;
import java.time.Duration;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.BiConsumer;
@@ -347,4 +348,20 @@ public class ContextDataFetcherDecoratorTests {
assertThat(dataFetcherCancelled).isTrue();
}
@Test
void testExtensionsAreRetained() throws Exception {
GraphQL graphQl = GraphQlSetup.schemaContent(SCHEMA_CONTENT)
.queryFetcher("greeting", (env) ->
DataFetcherResult.newResult().data("Hello")
.extensions(Map.of("foo", "bar")).build())
.toGraphQl();
ExecutionInput input = ExecutionInput.newExecutionInput().query("{ greeting }").build();
ExecutionResult executionResult = graphQl.executeAsync(input).get();
String greeting = ResponseHelper.forResult(executionResult).toEntity("greeting", String.class);
assertThat(greeting).isEqualTo("Hello");
assertThat(executionResult.getExtensions()).containsEntry("foo", "bar");
}
}