From fbb0fd15a7ec28d08b77d4cddb320f2dcbc8596c Mon Sep 17 00:00:00 2001 From: dondonz <13839920+dondonz@users.noreply.github.com> Date: Thu, 15 May 2025 17:07:14 +1000 Subject: [PATCH] Cherry pick PR 3929 reduce nonnullablefieldvalidator allocations --- .../java/graphql/execution/Execution.java | 2 +- .../graphql/execution/ExecutionStrategy.java | 12 ++--- .../ExecutionStrategyParameters.java | 5 +- .../execution/NonNullableFieldValidator.java | 7 ++- .../SubscriptionExecutionStrategy.java | 10 ++-- .../AsyncExecutionStrategyTest.groovy | 5 ++ .../AsyncSerialExecutionStrategyTest.groovy | 2 + .../ExecutionStrategyParametersTest.groovy | 2 + .../execution/ExecutionStrategyTest.groovy | 46 ++++++++++--------- .../NonNullableFieldValidatorTest.groovy | 25 +++++++--- 10 files changed, 66 insertions(+), 50 deletions(-) diff --git a/src/main/java/graphql/execution/Execution.java b/src/main/java/graphql/execution/Execution.java index a784325f3d..bc55308150 100644 --- a/src/main/java/graphql/execution/Execution.java +++ b/src/main/java/graphql/execution/Execution.java @@ -187,7 +187,7 @@ private CompletableFuture executeOperation(ExecutionContext exe ResultPath path = ResultPath.rootPath(); ExecutionStepInfo executionStepInfo = newExecutionStepInfo().type(operationRootType).path(path).build(); - NonNullableFieldValidator nonNullableFieldValidator = new NonNullableFieldValidator(executionContext, executionStepInfo); + NonNullableFieldValidator nonNullableFieldValidator = new NonNullableFieldValidator(executionContext); ExecutionStrategyParameters parameters = newParameters() .executionStepInfo(executionStepInfo) diff --git a/src/main/java/graphql/execution/ExecutionStrategy.java b/src/main/java/graphql/execution/ExecutionStrategy.java index 47e9245496..d351668e8b 100644 --- a/src/main/java/graphql/execution/ExecutionStrategy.java +++ b/src/main/java/graphql/execution/ExecutionStrategy.java @@ -619,10 +619,7 @@ private FieldValueInfo completeField(GraphQLFieldDefinition fieldDef, ExecutionC instrumentationParams, executionContext.getInstrumentationState() )); - NonNullableFieldValidator nonNullableFieldValidator = new NonNullableFieldValidator(executionContext, executionStepInfo); - ExecutionStrategyParameters newParameters = parameters.transform(executionStepInfo, - nonNullableFieldValidator, fetchedValue.getLocalContext(), fetchedValue.getFetchedValue()); @@ -781,13 +778,12 @@ protected FieldValueInfo completeValueForList(ExecutionContext executionContext, ExecutionStepInfo stepInfoForListElement = executionStepInfoFactory.newExecutionStepInfoForListElement(executionStepInfo, indexedPath); - NonNullableFieldValidator nonNullableFieldValidator = new NonNullableFieldValidator(executionContext, stepInfoForListElement); - FetchedValue value = unboxPossibleDataFetcherResult(executionContext, parameters, item); ExecutionStrategyParameters newParameters = parameters.transform(stepInfoForListElement, - nonNullableFieldValidator, indexedPath, - value.getLocalContext(), value.getFetchedValue()); + indexedPath, + value.getLocalContext(), + value.getFetchedValue()); fieldValueInfos.add(completeValue(executionContext, newParameters)); index++; @@ -926,10 +922,8 @@ protected Object completeValueForObject(ExecutionContext executionContext, Execu ); ExecutionStepInfo newExecutionStepInfo = executionStepInfo.changeTypeWithPreservedNonNull(resolvedObjectType); - NonNullableFieldValidator nonNullableFieldValidator = new NonNullableFieldValidator(executionContext, newExecutionStepInfo); ExecutionStrategyParameters newParameters = parameters.transform(newExecutionStepInfo, - nonNullableFieldValidator, subFields, result); diff --git a/src/main/java/graphql/execution/ExecutionStrategyParameters.java b/src/main/java/graphql/execution/ExecutionStrategyParameters.java index 116a50751d..58eb3d1767 100644 --- a/src/main/java/graphql/execution/ExecutionStrategyParameters.java +++ b/src/main/java/graphql/execution/ExecutionStrategyParameters.java @@ -38,7 +38,7 @@ private ExecutionStrategyParameters(ExecutionStepInfo executionStepInfo, this.localContext = localContext; this.fields = assertNotNull(fields, () -> "fields is null"); this.source = source; - this.nonNullableFieldValidator = nonNullableFieldValidator; + this.nonNullableFieldValidator = assertNotNull(nonNullableFieldValidator, () -> "requires a NonNullValidator");; this.path = path; this.currentField = currentField; this.parent = parent; @@ -132,7 +132,6 @@ ExecutionStrategyParameters transform(MergedField currentField, @Internal ExecutionStrategyParameters transform(ExecutionStepInfo executionStepInfo, - NonNullableFieldValidator nonNullableFieldValidator, MergedSelectionSet fields, Object source) { return new ExecutionStrategyParameters(executionStepInfo, @@ -148,7 +147,6 @@ ExecutionStrategyParameters transform(ExecutionStepInfo executionStepInfo, @Internal ExecutionStrategyParameters transform(ExecutionStepInfo executionStepInfo, - NonNullableFieldValidator nonNullableFieldValidator, ResultPath path, Object localContext, Object source) { @@ -165,7 +163,6 @@ ExecutionStrategyParameters transform(ExecutionStepInfo executionStepInfo, @Internal ExecutionStrategyParameters transform(ExecutionStepInfo executionStepInfo, - NonNullableFieldValidator nonNullableFieldValidator, Object localContext, Object source) { return new ExecutionStrategyParameters(executionStepInfo, diff --git a/src/main/java/graphql/execution/NonNullableFieldValidator.java b/src/main/java/graphql/execution/NonNullableFieldValidator.java index d7e14900a4..b59f633bac 100644 --- a/src/main/java/graphql/execution/NonNullableFieldValidator.java +++ b/src/main/java/graphql/execution/NonNullableFieldValidator.java @@ -14,15 +14,13 @@ public class NonNullableFieldValidator { private final ExecutionContext executionContext; - private final ExecutionStepInfo executionStepInfo; - public NonNullableFieldValidator(ExecutionContext executionContext, ExecutionStepInfo executionStepInfo) { + public NonNullableFieldValidator(ExecutionContext executionContext) { this.executionContext = executionContext; - this.executionStepInfo = executionStepInfo; } /** - * Called to check that a value is non null if the type requires it to be non null + * Called to check that a value is non-null if the type requires it to be non null * * @param parameters the execution strategy parameters * @param result the result to check @@ -34,6 +32,7 @@ public NonNullableFieldValidator(ExecutionContext executionContext, ExecutionSte */ public T validate(ExecutionStrategyParameters parameters, T result) throws NonNullableFieldWasNullException { if (result == null) { + ExecutionStepInfo executionStepInfo = parameters.getExecutionStepInfo(); if (executionStepInfo.isNonNullType()) { // see https://spec.graphql.org/October2021/#sec-Errors-and-Non-Nullability // diff --git a/src/main/java/graphql/execution/SubscriptionExecutionStrategy.java b/src/main/java/graphql/execution/SubscriptionExecutionStrategy.java index e8f0763c0a..365e3e3737 100644 --- a/src/main/java/graphql/execution/SubscriptionExecutionStrategy.java +++ b/src/main/java/graphql/execution/SubscriptionExecutionStrategy.java @@ -106,7 +106,7 @@ private boolean keepOrdered(GraphQLContext graphQLContext) { */ private CompletableFuture> createSourceEventStream(ExecutionContext executionContext, ExecutionStrategyParameters parameters) { - ExecutionStrategyParameters newParameters = firstFieldOfSubscriptionSelection(parameters); + ExecutionStrategyParameters newParameters = firstFieldOfSubscriptionSelection(executionContext,parameters); CompletableFuture fieldFetched = Async.toCompletableFuture(fetchField(executionContext, newParameters)); return fieldFetched.thenApply(fetchedValue -> { @@ -139,7 +139,7 @@ private CompletableFuture executeSubscriptionEvent(ExecutionCon .root(eventPayload) .resetErrors() ); - ExecutionStrategyParameters newParameters = firstFieldOfSubscriptionSelection(parameters); + ExecutionStrategyParameters newParameters = firstFieldOfSubscriptionSelection(newExecutionContext, parameters); ExecutionStepInfo subscribedFieldStepInfo = createSubscribedFieldStepInfo(executionContext, newParameters); InstrumentationFieldParameters i13nFieldParameters = new InstrumentationFieldParameters(executionContext, () -> subscribedFieldStepInfo); @@ -179,12 +179,14 @@ private String getRootFieldName(ExecutionStrategyParameters parameters) { return rootField.getResultKey(); } - private ExecutionStrategyParameters firstFieldOfSubscriptionSelection(ExecutionStrategyParameters parameters) { + private ExecutionStrategyParameters firstFieldOfSubscriptionSelection(ExecutionContext executionContext, ExecutionStrategyParameters parameters) { MergedSelectionSet fields = parameters.getFields(); MergedField firstField = fields.getSubField(fields.getKeys().get(0)); ResultPath fieldPath = parameters.getPath().segment(mkNameForPath(firstField.getSingleField())); - return parameters.transform(firstField,fieldPath); + NonNullableFieldValidator nonNullableFieldValidator = new NonNullableFieldValidator(executionContext); + return parameters.transform(builder -> builder + .field(firstField).path(fieldPath).nonNullFieldValidator(nonNullableFieldValidator)); } private ExecutionStepInfo createSubscribedFieldStepInfo(ExecutionContext executionContext, ExecutionStrategyParameters parameters) { diff --git a/src/test/groovy/graphql/execution/AsyncExecutionStrategyTest.groovy b/src/test/groovy/graphql/execution/AsyncExecutionStrategyTest.groovy index 0b7b5f2a11..9d99fbbfba 100644 --- a/src/test/groovy/graphql/execution/AsyncExecutionStrategyTest.groovy +++ b/src/test/groovy/graphql/execution/AsyncExecutionStrategyTest.groovy @@ -117,6 +117,7 @@ abstract class AsyncExecutionStrategyTest extends Specification { .newParameters() .executionStepInfo(typeInfo) .fields(mergedSelectionSet(['hello': mergedField([Field.newField('hello').build()]), 'hello2': mergedField([Field.newField('hello2').build()])])) + .nonNullFieldValidator(new NonNullableFieldValidator(executionContext)) .build() AsyncExecutionStrategy asyncExecutionStrategy = new AsyncExecutionStrategy() @@ -160,6 +161,7 @@ abstract class AsyncExecutionStrategyTest extends Specification { .newParameters() .executionStepInfo(typeInfo) .fields(mergedSelectionSet(['hello': mergedField([Field.newField('hello').build()]), 'hello2': mergedField([Field.newField('hello2').build()])])) + .nonNullFieldValidator(new NonNullableFieldValidator(executionContext)) .build() AsyncExecutionStrategy asyncExecutionStrategy = new AsyncExecutionStrategy() @@ -205,6 +207,7 @@ abstract class AsyncExecutionStrategyTest extends Specification { .newParameters() .executionStepInfo(typeInfo) .fields(mergedSelectionSet(['hello': mergedField([Field.newField('hello').build()]), 'hello2': mergedField([Field.newField('hello2').build()])])) + .nonNullFieldValidator(new NonNullableFieldValidator(executionContext)) .build() AsyncExecutionStrategy asyncExecutionStrategy = new AsyncExecutionStrategy() @@ -249,6 +252,7 @@ abstract class AsyncExecutionStrategyTest extends Specification { .newParameters() .executionStepInfo(typeInfo) .fields(mergedSelectionSet(['hello': mergedField([Field.newField('hello').build()]), 'hello2': mergedField([Field.newField('hello2').build()])])) + .nonNullFieldValidator(new NonNullableFieldValidator(executionContext)) .build() AsyncExecutionStrategy asyncExecutionStrategy = new AsyncExecutionStrategy() @@ -312,6 +316,7 @@ abstract class AsyncExecutionStrategyTest extends Specification { .newParameters() .executionStepInfo(typeInfo) .fields(mergedSelectionSet(['hello': mergedField([new Field('hello')]), 'hello2': mergedField([new Field('hello2')])])) + .nonNullFieldValidator(new NonNullableFieldValidator(executionContext)) .build() AsyncExecutionStrategy asyncExecutionStrategy = new AsyncExecutionStrategy() diff --git a/src/test/groovy/graphql/execution/AsyncSerialExecutionStrategyTest.groovy b/src/test/groovy/graphql/execution/AsyncSerialExecutionStrategyTest.groovy index efb67639d5..937c99c705 100644 --- a/src/test/groovy/graphql/execution/AsyncSerialExecutionStrategyTest.groovy +++ b/src/test/groovy/graphql/execution/AsyncSerialExecutionStrategyTest.groovy @@ -115,6 +115,7 @@ class AsyncSerialExecutionStrategyTest extends Specification { .newParameters() .executionStepInfo(typeInfo) .fields(mergedSelectionSet(['hello': mergedField(new Field('hello')), 'hello2': mergedField(new Field('hello2')), 'hello3': mergedField(new Field('hello3'))])) + .nonNullFieldValidator(new NonNullableFieldValidator(executionContext)) .build() AsyncSerialExecutionStrategy strategy = new AsyncSerialExecutionStrategy() @@ -163,6 +164,7 @@ class AsyncSerialExecutionStrategyTest extends Specification { .newParameters() .executionStepInfo(typeInfo) .fields(mergedSelectionSet(['hello': mergedField(new Field('hello')), 'hello2': mergedField(new Field('hello2')), 'hello3': mergedField(new Field('hello3'))])) + .nonNullFieldValidator(new NonNullableFieldValidator(executionContext)) .build() AsyncSerialExecutionStrategy strategy = new AsyncSerialExecutionStrategy() diff --git a/src/test/groovy/graphql/execution/ExecutionStrategyParametersTest.groovy b/src/test/groovy/graphql/execution/ExecutionStrategyParametersTest.groovy index e45ff7c546..df09445497 100644 --- a/src/test/groovy/graphql/execution/ExecutionStrategyParametersTest.groovy +++ b/src/test/groovy/graphql/execution/ExecutionStrategyParametersTest.groovy @@ -12,10 +12,12 @@ class ExecutionStrategyParametersTest extends Specification { def "ExecutionParameters can be transformed"() { given: + def executionContext = Mock(ExecutionContext) def parameters = newParameters() .executionStepInfo(newExecutionStepInfo().type(GraphQLString)) .source(new Object()) .localContext("localContext") + .nonNullFieldValidator(new NonNullableFieldValidator(executionContext)) .fields(mergedSelectionSet("a": [])) .build() diff --git a/src/test/groovy/graphql/execution/ExecutionStrategyTest.groovy b/src/test/groovy/graphql/execution/ExecutionStrategyTest.groovy index ca513d5ba1..a8de454c06 100644 --- a/src/test/groovy/graphql/execution/ExecutionStrategyTest.groovy +++ b/src/test/groovy/graphql/execution/ExecutionStrategyTest.groovy @@ -137,6 +137,7 @@ class ExecutionStrategyTest extends Specification { .executionStepInfo(ExecutionStepInfo.newExecutionStepInfo().type(objectType)) .source(result) .fields(mergedSelectionSet(["fld": [Field.newField().build()]])) + .nonNullFieldValidator(new NonNullableFieldValidator(executionContext)) .field(mergedField(Field.newField().build())) .build() @@ -157,7 +158,7 @@ class ExecutionStrategyTest extends Specification { Field field = new Field("someField") def fldDef = newFieldDefinition().name("test").type(fieldType).build() def executionStepInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldType).path(ResultPath.rootPath()).fieldDefinition(fldDef).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, executionStepInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) def result = ["test", "1", "2", "3"] @@ -182,7 +183,7 @@ class ExecutionStrategyTest extends Specification { def fieldType = GraphQLString def fldDef = newFieldDefinition().name("test").type(fieldType).build() def executionStepInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldType).fieldDefinition(fldDef).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, executionStepInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) def parameters = newParameters() .executionStepInfo(executionStepInfo) .nonNullFieldValidator(nullableFieldValidator) @@ -208,7 +209,7 @@ class ExecutionStrategyTest extends Specification { def fieldType = nonNull(GraphQLString) def fldDef = newFieldDefinition().name("test").type(fieldType).build() def executionStepInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldType).fieldDefinition(fldDef).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, executionStepInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) def parameters = newParameters() .executionStepInfo(executionStepInfo) .nonNullFieldValidator(nullableFieldValidator) @@ -230,7 +231,7 @@ class ExecutionStrategyTest extends Specification { def fieldType = GraphQLString def fldDef = newFieldDefinition().name("test").type(fieldType).build() def executionStepInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldType).fieldDefinition(fldDef).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, executionStepInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) def parameters = newParameters() .executionStepInfo(executionStepInfo) .nonNullFieldValidator(nullableFieldValidator) @@ -256,7 +257,7 @@ class ExecutionStrategyTest extends Specification { def fieldType = nonNull(GraphQLString) def fldDef = newFieldDefinition().name("test").type(fieldType).build() def executionStepInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldType).fieldDefinition(fldDef).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, executionStepInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) def parameters = newParameters() .executionStepInfo(executionStepInfo) .nonNullFieldValidator(nullableFieldValidator) @@ -278,7 +279,7 @@ class ExecutionStrategyTest extends Specification { def fieldType = GraphQLString def fldDef = newFieldDefinition().name("test").type(fieldType).build() def executionStepInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldType).fieldDefinition(fldDef).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, executionStepInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) def parameters = newParameters() .executionStepInfo(executionStepInfo) .nonNullFieldValidator(nullableFieldValidator) @@ -304,7 +305,7 @@ class ExecutionStrategyTest extends Specification { def fieldType = nonNull(GraphQLString) def fldDef = newFieldDefinition().name("test").type(fieldType).build() def typeInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldType).fieldDefinition(fldDef).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, typeInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) def parameters = newParameters() .executionStepInfo(typeInfo) .nonNullFieldValidator(nullableFieldValidator) @@ -326,7 +327,7 @@ class ExecutionStrategyTest extends Specification { def fieldType = GraphQLString def fldDef = newFieldDefinition().name("test").type(fieldType).build() def typeInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldType).fieldDefinition(fldDef).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, typeInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) def parameters = newParameters() .executionStepInfo(typeInfo) .nonNullFieldValidator(nullableFieldValidator) @@ -352,7 +353,7 @@ class ExecutionStrategyTest extends Specification { def fieldType = nonNull(GraphQLString) def fldDef = newFieldDefinition().name("test").type(fieldType).build() def typeInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldType).fieldDefinition(fldDef).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, typeInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) def parameters = newParameters() .executionStepInfo(typeInfo) .nonNullFieldValidator(nullableFieldValidator) @@ -374,7 +375,7 @@ class ExecutionStrategyTest extends Specification { def fieldType = list(GraphQLString) def fldDef = newFieldDefinition().name("test").type(fieldType).build() def executionStepInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldType).path(ResultPath.rootPath()).fieldDefinition(fldDef).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, executionStepInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) def result = ["test", "1", "2", "3"] def parameters = newParameters() .executionStepInfo(executionStepInfo) @@ -396,7 +397,7 @@ class ExecutionStrategyTest extends Specification { ExecutionContext executionContext = buildContext() def fieldType = Scalars.GraphQLInt def typeInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldType).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, typeInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) String result = "not a number" def parameters = newParameters() @@ -421,7 +422,7 @@ class ExecutionStrategyTest extends Specification { ExecutionContext executionContext = buildContext() GraphQLEnumType enumType = newEnum().name("Enum").value("value").build() def typeInfo = ExecutionStepInfo.newExecutionStepInfo().type(enumType).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, typeInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) String result = "not a enum number" def parameters = newParameters() @@ -468,7 +469,7 @@ class ExecutionStrategyTest extends Specification { ExecutionContext executionContext = buildContext() def fieldType = NullProducingScalar def typeInfo = ExecutionStepInfo.newExecutionStepInfo().type(nonNull(fieldType)).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, typeInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) when: def parameters = newParameters() @@ -529,7 +530,7 @@ class ExecutionStrategyTest extends Specification { .build() ExecutionContext executionContext = buildContext(schema) ExecutionStepInfo typeInfo = ExecutionStepInfo.newExecutionStepInfo().type(objectType).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, typeInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) Argument argument = new Argument("arg1", new StringValue("argVal")) Field field = new Field(someFieldName, [argument]) MergedField mergedField = mergedField(field) @@ -594,7 +595,7 @@ class ExecutionStrategyTest extends Specification { .build() ExecutionContext executionContext = buildContext(schema) def typeInfo = ExecutionStepInfo.newExecutionStepInfo().type(objectType).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, typeInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) ResultPath expectedPath = ResultPath.rootPath().segment(someFieldName) SourceLocation sourceLocation = new SourceLocation(666, 999) @@ -730,7 +731,7 @@ class ExecutionStrategyTest extends Specification { ExecutionContext executionContext = buildContext(schema) def typeInfo = ExecutionStepInfo.newExecutionStepInfo().type(objectType).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, typeInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) Field field = new Field(someFieldName) def parameters = newParameters() @@ -759,7 +760,7 @@ class ExecutionStrategyTest extends Specification { def fieldType = list(Scalars.GraphQLInt) def fldDef = newFieldDefinition().name("test").type(fieldType).build() def executionStepInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldType).path(ResultPath.rootPath()).fieldDefinition(fldDef).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, executionStepInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) def parameters = newParameters() .executionStepInfo(executionStepInfo) @@ -783,7 +784,7 @@ class ExecutionStrategyTest extends Specification { def fieldType = list(Scalars.GraphQLInt) def fldDef = newFieldDefinition().name("test").type(fieldType).build() def executionStepInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldType).path(ResultPath.rootPath()).fieldDefinition(fldDef).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, executionStepInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) def parameters = newParameters() .executionStepInfo(executionStepInfo) @@ -807,7 +808,7 @@ class ExecutionStrategyTest extends Specification { def fieldType = list(Scalars.GraphQLInt) def fldDef = newFieldDefinition().name("test").type(fieldType).build() def executionStepInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldType).path(ResultPath.rootPath()).fieldDefinition(fldDef).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, executionStepInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) def parameters = newParameters() .executionStepInfo(executionStepInfo) @@ -837,6 +838,7 @@ class ExecutionStrategyTest extends Specification { .path(ResultPath.fromList(["parent"])) .field(mergedField(field)) .fields(mergedSelectionSet(["parent": [mergedField(field)]])) + .nonNullFieldValidator(new NonNullableFieldValidator(executionContext)) .executionStepInfo(executionStepInfo) .build() @@ -869,6 +871,7 @@ class ExecutionStrategyTest extends Specification { .field(mergedField(field)) .fields(mergedSelectionSet(["parent": [mergedField(field)]])) .executionStepInfo(executionStepInfo) + .nonNullFieldValidator(new NonNullableFieldValidator(executionContext)) .build() when: @@ -890,6 +893,7 @@ class ExecutionStrategyTest extends Specification { .path(ResultPath.fromList(["parent"])) .field(mergedField(field)) .fields(mergedSelectionSet(["parent": [mergedField(field)]])) + .nonNullFieldValidator(new NonNullableFieldValidator(executionContext)) .executionStepInfo(executionStepInfo) .build() @@ -913,7 +917,7 @@ class ExecutionStrategyTest extends Specification { def fieldType = list(Scalars.GraphQLInt) def fldDef = newFieldDefinition().name("test").type(fieldType).build() def executionStepInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldType).path(ResultPath.rootPath()).fieldDefinition(fldDef).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, executionStepInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) def parameters = newParameters() .executionStepInfo(executionStepInfo) @@ -937,7 +941,7 @@ class ExecutionStrategyTest extends Specification { def fieldType = list(Scalars.GraphQLInt) def fldDef = newFieldDefinition().name("test").type(fieldType).build() def typeInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldType).fieldDefinition(fldDef).build() - NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext, typeInfo) + NonNullableFieldValidator nullableFieldValidator = new NonNullableFieldValidator(executionContext) def parameters = newParameters() .executionStepInfo(typeInfo) diff --git a/src/test/groovy/graphql/execution/NonNullableFieldValidatorTest.groovy b/src/test/groovy/graphql/execution/NonNullableFieldValidatorTest.groovy index 34a48affe7..33977d515c 100644 --- a/src/test/groovy/graphql/execution/NonNullableFieldValidatorTest.groovy +++ b/src/test/groovy/graphql/execution/NonNullableFieldValidatorTest.groovy @@ -7,10 +7,6 @@ import static graphql.schema.GraphQLNonNull.nonNull class NonNullableFieldValidatorTest extends Specification { - def parameters = Mock(ExecutionStrategyParameters) { - getPath() >> ResultPath.rootPath() - } - def "non nullable field throws exception"() { ExecutionContext context = Mock(ExecutionContext) { propagateErrorsOnNonNullContractFailure() >> true @@ -18,7 +14,12 @@ class NonNullableFieldValidatorTest extends Specification { ExecutionStepInfo typeInfo = ExecutionStepInfo.newExecutionStepInfo().type(nonNull(GraphQLString)).build() - NonNullableFieldValidator validator = new NonNullableFieldValidator(context, typeInfo) + def parameters = Mock(ExecutionStrategyParameters) { + getPath() >> ResultPath.rootPath() + getExecutionStepInfo() >> typeInfo + } + + NonNullableFieldValidator validator = new NonNullableFieldValidator(context) when: validator.validate(parameters, null) @@ -35,7 +36,12 @@ class NonNullableFieldValidatorTest extends Specification { ExecutionStepInfo typeInfo = ExecutionStepInfo.newExecutionStepInfo().type(GraphQLString).build() - NonNullableFieldValidator validator = new NonNullableFieldValidator(context, typeInfo) + def parameters = Mock(ExecutionStrategyParameters) { + getPath() >> ResultPath.rootPath() + getExecutionStepInfo() >> typeInfo + } + + NonNullableFieldValidator validator = new NonNullableFieldValidator(context) when: def result = validator.validate(parameters, null) @@ -51,7 +57,12 @@ class NonNullableFieldValidatorTest extends Specification { ExecutionStepInfo typeInfo = ExecutionStepInfo.newExecutionStepInfo().type(nonNull(GraphQLString)).build() - NonNullableFieldValidator validator = new NonNullableFieldValidator(context, typeInfo) + def parameters = Mock(ExecutionStrategyParameters) { + getPath() >> ResultPath.rootPath() + getExecutionStepInfo() >> typeInfo + } + + NonNullableFieldValidator validator = new NonNullableFieldValidator(context) when: def result = validator.validate(parameters, null)