diff --git a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/AbstractGraphQlTesterBuilder.java b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/AbstractGraphQlTesterBuilder.java index 608d1737..0990752a 100644 --- a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/AbstractGraphQlTesterBuilder.java +++ b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/AbstractGraphQlTesterBuilder.java @@ -113,7 +113,7 @@ public abstract class AbstractGraphQlTesterBuilder> builderInitializer; - /** * Package private constructor for use from {@link AbstractGraphQlTesterBuilder}. */ DefaultGraphQlTester( GraphQlTransport transport, @Nullable Predicate errorFilter, - Configuration jsonPathConfig, DocumentSource documentSource, Duration timeout, - Consumer> builderInitializer) { + Configuration jsonPathConfig, DocumentSource documentSource, Duration timeout) { Assert.notNull(transport, "GraphQlTransport is required"); Assert.notNull(jsonPathConfig, "JSONPath Configuration is required"); Assert.notNull(documentSource, "DocumentSource is required"); - Assert.notNull(builderInitializer, "`builderInitializer` is required"); this.transport = transport; this.errorFilter = errorFilter; this.jsonPathConfig = jsonPathConfig; this.documentSource = documentSource; this.responseTimeout = timeout; - this.builderInitializer = builderInitializer; } @@ -107,30 +102,14 @@ final class DefaultGraphQlTester implements GraphQlTester { return document(document); } - @Override - public Builder mutate() { - Builder builder = new Builder(this.transport); - this.builderInitializer.accept(builder); - return builder; - } - - /** - * Default {@link GraphQlTester.Builder} with a given transport. + * The default tester is unaware of transport details, and cannot implement + * mutate directly. It should be wrapped from transport aware extensions via + * {@link AbstractDelegatingGraphQlTester} that also implement mutate. */ - static final class Builder extends AbstractGraphQlTesterBuilder { - - private final GraphQlTransport transport; - - Builder(GraphQlTransport transport) { - this.transport = transport; - } - - @Override - public GraphQlTester build() { - return super.buildGraphQlTester(this.transport); - } - + @Override + public Builder mutate() { + throw new UnsupportedOperationException(); } diff --git a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/GenericGraphQlTester.java b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/GenericGraphQlTester.java new file mode 100644 index 00000000..fe70e0ae --- /dev/null +++ b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/GenericGraphQlTester.java @@ -0,0 +1,77 @@ +/* + * Copyright 2002-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.graphql.test.tester; + + +import java.util.function.Consumer; + +import org.springframework.graphql.client.GraphQlTransport; +import org.springframework.util.Assert; + +/** + * {@link GraphQlTester} with a given, externally prepared transport. + * + * @author Rossen Stoyanchev + * @since 1.0.0 + */ +final class GenericGraphQlTester extends AbstractDelegatingGraphQlTester { + + private final GraphQlTransport transport; + + private final Consumer> builderInitializer; + + + GenericGraphQlTester( + GraphQlTester delegate, GraphQlTransport transport, + Consumer> builderInitializer) { + + super(delegate); + Assert.notNull(transport, "GraphQlTransport is required"); + Assert.notNull(builderInitializer, "'builderInitializer' is required"); + this.transport = transport; + this.builderInitializer = builderInitializer; + } + + + @Override + public Builder mutate() { + Builder builder = new Builder(this.transport); + this.builderInitializer.accept(builder); + return builder; + } + + + /** + * Default {@link GraphQlTester.Builder} with a given transport. + */ + static final class Builder extends AbstractGraphQlTesterBuilder { + + private final GraphQlTransport transport; + + Builder(GraphQlTransport transport) { + this.transport = transport; + } + + @Override + public GraphQlTester build() { + GraphQlTester tester = super.buildGraphQlTester(this.transport); + return new GenericGraphQlTester(tester, this.transport, getBuilderInitializer()); + } + + } + +} diff --git a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/GraphQlTester.java b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/GraphQlTester.java index e1f5f432..04d99a79 100644 --- a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/GraphQlTester.java +++ b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/GraphQlTester.java @@ -88,7 +88,7 @@ public interface GraphQlTester { * @return the builder for further initialization */ static GraphQlTester.Builder builder(GraphQlTransport transport) { - return new DefaultGraphQlTester.Builder(transport); + return new GenericGraphQlTester.Builder(transport); } diff --git a/spring-graphql/src/main/java/org/springframework/graphql/client/DefaultGraphQlClient.java b/spring-graphql/src/main/java/org/springframework/graphql/client/DefaultGraphQlClient.java index c501346a..dbb7c328 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/client/DefaultGraphQlClient.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/client/DefaultGraphQlClient.java @@ -70,9 +70,9 @@ final class DefaultGraphQlClient implements GraphQlClient { } /** - * The default client is unaware of transport details, and doesn't implement - * this method. It should always be wrapped via with a transport specific - * {@link AbstractDelegatingGraphQlClient} that implements mutation. + * The default client is unaware of transport details, and cannot implement + * mutate directly. It should be wrapped from transport aware extensions via + * {@link AbstractDelegatingGraphQlClient} that also implement mutate. */ @Override public Builder mutate() { diff --git a/spring-graphql/src/main/java/org/springframework/graphql/client/GenericGraphQlClient.java b/spring-graphql/src/main/java/org/springframework/graphql/client/GenericGraphQlClient.java index 70f6a945..7ac600be 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/client/GenericGraphQlClient.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/client/GenericGraphQlClient.java @@ -49,7 +49,7 @@ final class GenericGraphQlClient extends AbstractDelegatingGraphQlClient { @Override public Builder mutate() { - Builder builder = new Builder(transport); + Builder builder = new Builder(this.transport); this.builderInitializer.accept(builder); return builder; }