@@ -2,7 +2,14 @@ package graphql
22
33import graphql.analysis.MaxQueryComplexityInstrumentation
44import graphql.analysis.MaxQueryDepthInstrumentation
5+ import graphql.execution.AsyncExecutionStrategy
6+ import graphql.execution.ExecutionContext
7+ import graphql.execution.ExecutionId
8+ import graphql.execution.ExecutionIdProvider
9+ import graphql.execution.ExecutionStrategyParameters
510import graphql.execution.batched.BatchedExecutionStrategy
11+ import graphql.execution.instrumentation.Instrumentation
12+ import graphql.execution.instrumentation.NoOpInstrumentation
613import graphql.language.SourceLocation
714import graphql.schema.DataFetcher
815import graphql.schema.DataFetchingEnvironment
@@ -610,7 +617,7 @@ class GraphQLTest extends Specification {
610617 .build()).build())
611618 .build()
612619
613- MaxQueryDepthInstrumentation maximumQueryDepthInstrumentation = new MaxQueryDepthInstrumentation(3);
620+ MaxQueryDepthInstrumentation maximumQueryDepthInstrumentation = new MaxQueryDepthInstrumentation(3)
614621
615622
616623 def graphql = GraphQL.newGraphQL(schema).instrumentation(maximumQueryDepthInstrumentation).build()
@@ -654,7 +661,7 @@ class GraphQLTest extends Specification {
654661 .build()).build())
655662 .build()
656663
657- MaxQueryComplexityInstrumentation maxQueryComplexityInstrumentation = new MaxQueryComplexityInstrumentation(3);
664+ MaxQueryComplexityInstrumentation maxQueryComplexityInstrumentation = new MaxQueryComplexityInstrumentation(3)
658665
659666
660667 def graphql = GraphQL.newGraphQL(schema).instrumentation(maxQueryComplexityInstrumentation).build()
@@ -711,7 +718,7 @@ class GraphQLTest extends Specification {
711718
712719 GraphQLSchema schema = newSchema()
713720 .query(query)
714- .build();
721+ .build()
715722
716723 GraphQL graphQL = GraphQL.newGraphQL(schema)
717724 .instrumentation(instrumentation)
@@ -722,7 +729,7 @@ class GraphQLTest extends Specification {
722729 .build()
723730
724731 when:
725- def result = graphQL.execute(executionInput);
732+ def result = graphQL.execute(executionInput)
726733
727734 then:
728735 result.errors.size() == 1
@@ -737,7 +744,7 @@ class GraphQLTest extends Specification {
737744
738745 def " batched execution with non batched DataFetcher returning CompletableFuture " () {
739746 given:
740- GraphQLObjectType foo = GraphQLObjectType. newObject()
747+ GraphQLObjectType foo = newObject()
741748 .name(" Foo " )
742749 .withInterface(new GraphQLTypeReference(" Node " ))
743750 .field(
@@ -760,14 +767,14 @@ class GraphQLTest extends Specification {
760767 {
761768 env ->
762769 if (env.getObject() instanceof CompletableFuture) {
763- throw new RuntimeException(" This seems bad! " );
770+ throw new RuntimeException(" This seems bad! " )
764771 }
765772
766773 return foo
767774 })
768775 .build()
769776
770- GraphQLObjectType query = GraphQLObjectType. newObject()
777+ GraphQLObjectType query = newObject()
771778 .name(" RootQuery " )
772779 .field(
773780 { field ->
@@ -786,16 +793,16 @@ class GraphQLTest extends Specification {
786793 } as UnaryOperator)
787794 .build()
788795
789- GraphQLSchema schema = GraphQLSchema. newSchema()
796+ GraphQLSchema schema = newSchema()
790797 .query(query)
791798 .build()
792799
793800 GraphQL graphQL = GraphQL.newGraphQL(schema)
794801 .queryExecutionStrategy(new BatchedExecutionStrategy())
795802 .mutationExecutionStrategy(new BatchedExecutionStrategy())
796- .build();
803+ .build()
797804
798- ExecutionInput executionInput = ExecutionInput. newExecutionInput()
805+ ExecutionInput executionInput = newExecutionInput()
799806 .query(" {node {id}}" )
800807 .build()
801808 when:
@@ -806,5 +813,66 @@ class GraphQLTest extends Specification {
806813 result.getData() == [node: [id: " abc" ]]
807814 }
808815
816+ class CaptureStrategy extends AsyncExecutionStrategy {
817+ ExecutionId executionId = null
818+ Instrumentation instrumentation = null
819+
820+ @Override
821+ CompletableFuture<ExecutionResult> execute(ExecutionContext executionContext, ExecutionStrategyParameters parameters) {
822+ executionId = executionContext.executionId
823+ instrumentation = executionContext.instrumentation
824+ return super.execute(executionContext, parameters)
825+ }
826+ }
827+
828+ def " graphql copying works as expected" () {
829+
830+ def instrumentation = new NoOpInstrumentation()
831+ def hello = ExecutionId.from(" hello" )
832+ def executionIdProvider = new ExecutionIdProvider() {
833+ @Override
834+ ExecutionId provide(String q, String operationName, Object context) {
835+ return hello
836+ }
837+ }
838+
839+ def queryStrategy = new CaptureStrategy()
840+ GraphQL graphQL = GraphQL.newGraphQL(simpleSchema())
841+ .queryExecutionStrategy(queryStrategy)
842+ .instrumentation(instrumentation)
843+ .executionIdProvider(executionIdProvider)
844+ .build()
845+
846+ when:
847+ // now copy it as is
848+ def newGraphQL = graphQL.transform({ builder -> })
849+ def result = newGraphQL.execute('{ hello }').data
850+
851+ then:
852+ result == [hello: 'world']
853+ queryStrategy.executionId == hello
854+ queryStrategy.instrumentation == instrumentation
855+
856+ when:
857+
858+ // now make some changes
859+ def newInstrumentation = new NoOpInstrumentation()
860+ def goodbye = ExecutionId.from(" goodbye" )
861+ def newExecutionIdProvider = new ExecutionIdProvider() {
862+ @Override
863+ ExecutionId provide(String q, String operationName, Object context) {
864+ return goodbye
865+ }
866+ }
867+
868+ newGraphQL = graphQL.transform({ builder ->
869+ builder.executionIdProvider(newExecutionIdProvider).instrumentation(newInstrumentation)
870+ })
871+ result = newGraphQL.execute('{ hello }').data
809872
873+ then:
874+ result == [hello: 'world']
875+ queryStrategy.executionId == goodbye
876+ queryStrategy.instrumentation == newInstrumentation
877+ }
810878}
0 commit comments