Skip to content

Commit 952a8f6

Browse files
authored
fix: add Graphql SchemaGenerator configurer auto configuration tests (#313)
1 parent 5c4fea9 commit 952a8f6

File tree

3 files changed

+241
-61
lines changed

3 files changed

+241
-61
lines changed

graphql-jpa-query-autoconfigure/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@
5252
<version>0.9.11</version>
5353
<scope>test</scope>
5454
</dependency>
55+
<dependency>
56+
<groupId>io.projectreactor</groupId>
57+
<artifactId>reactor-test</artifactId>
58+
<scope>test</scope>
59+
</dependency>
5560
</dependencies>
5661

5762
</project>

graphql-jpa-query-autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLSchemaAutoConfigurationTest.java

Lines changed: 146 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
import com.introproventures.graphql.jpa.query.autoconfigure.support.MutationRoot;
55
import com.introproventures.graphql.jpa.query.autoconfigure.support.QueryRoot;
66
import com.introproventures.graphql.jpa.query.autoconfigure.support.SubscriptionRoot;
7+
import com.introproventures.graphql.jpa.query.schema.JavaScalars;
8+
import com.introproventures.graphql.jpa.query.schema.JavaScalarsWiringPostProcessor;
9+
import graphql.ExecutionResult;
710
import graphql.GraphQL;
811
import graphql.Scalars;
912
import graphql.annotations.AnnotationsSchemaCreator;
@@ -12,33 +15,56 @@
1215
import graphql.annotations.annotationTypes.GraphQLName;
1316
import graphql.annotations.annotationTypes.directives.definition.GraphQLDirectiveDefinition;
1417
import graphql.scalars.ExtendedScalars;
15-
import graphql.schema.FieldCoordinates;
18+
import graphql.schema.DataFetcher;
1619
import graphql.schema.GraphQLCodeRegistry;
1720
import graphql.schema.GraphQLDirective;
1821
import graphql.schema.GraphQLFieldDefinition;
1922
import graphql.schema.GraphQLObjectType;
23+
import graphql.schema.GraphQLScalarType;
2024
import graphql.schema.GraphQLSchema;
2125
import graphql.schema.StaticDataFetcher;
26+
import graphql.schema.idl.RuntimeWiring;
27+
import graphql.schema.idl.SchemaGenerator;
28+
import graphql.schema.idl.SchemaParser;
29+
import graphql.schema.idl.TypeDefinitionRegistry;
2230
import org.junit.Test;
2331
import org.junit.runner.RunWith;
32+
import org.reactivestreams.Publisher;
2433
import org.reflections.Reflections;
2534
import org.springframework.beans.factory.annotation.Autowired;
2635
import org.springframework.beans.factory.annotation.Value;
2736
import org.springframework.boot.autoconfigure.SpringBootApplication;
2837
import org.springframework.boot.test.context.SpringBootTest;
2938
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
3039
import org.springframework.context.annotation.Configuration;
40+
import org.springframework.core.io.Resource;
3141
import org.springframework.stereotype.Component;
3242
import org.springframework.test.context.junit4.SpringRunner;
3343
import org.springframework.util.StringUtils;
34-
35-
import java.util.Collections;
44+
import reactor.core.publisher.Flux;
45+
import reactor.test.StepVerifier;
46+
47+
import java.io.File;
48+
import java.io.IOException;
49+
import java.time.Duration;
50+
import java.time.Instant;
51+
import java.util.LinkedHashMap;
52+
import java.util.List;
3653
import java.util.Map;
3754
import java.util.Set;
55+
import java.util.UUID;
56+
import java.util.function.Supplier;
3857
import java.util.stream.Collectors;
58+
import java.util.stream.Stream;
3959

4060
import static graphql.annotations.AnnotationsSchemaCreator.newAnnotationsSchema;
61+
import static graphql.schema.FieldCoordinates.coordinates;
62+
import static graphql.schema.GraphQLCodeRegistry.newCodeRegistry;
4163
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
64+
import static graphql.schema.GraphQLObjectType.newObject;
65+
import static graphql.schema.GraphQLSchema.newSchema;
66+
import static graphql.schema.idl.RuntimeWiring.newRuntimeWiring;
67+
import static java.util.Collections.emptyMap;
4268
import static org.assertj.core.api.Assertions.assertThat;
4369

4470
@RunWith(SpringRunner.class)
@@ -146,79 +172,121 @@ static class MutationGraphQLSchemaConfigurer implements GraphQLSchemaConfigurer
146172
@Override
147173
public void configure(GraphQLShemaRegistration registry) {
148174

149-
GraphQLObjectType mutation = GraphQLObjectType.newObject()
150-
.name("mutation")
151-
.field(GraphQLFieldDefinition.newFieldDefinition()
152-
.name("greet")
153-
.type(Scalars.GraphQLString)
154-
.dataFetcher(new StaticDataFetcher("hello world")))
155-
.field(GraphQLFieldDefinition.newFieldDefinition()
156-
.name("greet2")
157-
.type(Scalars.GraphQLString))
158-
.field(GraphQLFieldDefinition.newFieldDefinition()
159-
.name("count1")
160-
.type(ExtendedScalars.GraphQLLong))
161-
.build();
162-
163-
GraphQLCodeRegistry codeRegistry = GraphQLCodeRegistry.newCodeRegistry()
164-
.dataFetcher(FieldCoordinates.coordinates(mutation.getName(),
165-
"greet2"),
166-
new StaticDataFetcher("hello world2"))
167-
.build();
168-
169-
GraphQLSchema graphQLSchema = GraphQLSchema.newSchema()
170-
.query(GraphQLObjectType.newObject().name("null")
171-
.field(GraphQLFieldDefinition.newFieldDefinition()
172-
.name("null")
173-
.type(Scalars.GraphQLString)))
175+
GraphQLObjectType mutation = newObject().name("mutation")
176+
.field(GraphQLFieldDefinition.newFieldDefinition()
177+
.name("greet")
178+
.type(Scalars.GraphQLString)
179+
.dataFetcher(new StaticDataFetcher("hello world")))
180+
.field(GraphQLFieldDefinition.newFieldDefinition()
181+
.name("greet2")
182+
.type(Scalars.GraphQLString))
183+
.field(GraphQLFieldDefinition.newFieldDefinition()
184+
.name("count1")
185+
.type(ExtendedScalars.GraphQLLong))
186+
.build();
187+
188+
GraphQLCodeRegistry codeRegistry = newCodeRegistry().dataFetcher(coordinates(mutation.getName(),"greet2"),
189+
new StaticDataFetcher("hello world2"))
190+
.build();
191+
192+
GraphQLSchema graphQLSchema = newSchema()
193+
.query(newObject().name("null")
194+
.field(GraphQLFieldDefinition.newFieldDefinition()
195+
.name("null")
196+
.type(Scalars.GraphQLString)))
174197
.mutation(mutation)
175198
.codeRegistry(codeRegistry)
176199
.build();
177200

178201
registry.register(graphQLSchema);
179202
}
180203
}
204+
181205
@Component
182206
static class QueryGraphQLSchemaConfigurer implements GraphQLSchemaConfigurer {
183207

184208
@Override
185209
public void configure(GraphQLShemaRegistration registry) {
186-
GraphQLObjectType query = GraphQLObjectType.newObject()
187-
.name("query")
188-
.field(newFieldDefinition().name("hello")
189-
.type(Scalars.GraphQLString)
190-
.dataFetcher(new StaticDataFetcher("world")))
191-
.field(newFieldDefinition().name("hello2")
192-
.type(Scalars.GraphQLString))
193-
.field(newFieldDefinition().name("hello3")
194-
.type(GraphQLObjectType.newObject()
195-
.name("Hello3")
196-
.field(newFieldDefinition().name("canada")
197-
.type(Scalars.GraphQLString))
198-
.field(newFieldDefinition().name("america")
199-
.type(Scalars.GraphQLString))))
200-
.build();
201-
202-
GraphQLCodeRegistry codeRegistry = GraphQLCodeRegistry.newCodeRegistry()
203-
.dataFetcher(FieldCoordinates.coordinates(query.getName(), "hello2"),
204-
new StaticDataFetcher("world2"))
205-
.dataFetcher(FieldCoordinates.coordinates(query.getName(), "hello3"),
206-
new StaticDataFetcher(Collections.emptyMap()))
207-
.dataFetcher(FieldCoordinates.coordinates("Hello3", "america"),
208-
new StaticDataFetcher("Hi!"))
209-
.dataFetcher(FieldCoordinates.coordinates("Hello3", "canada"),
210-
new StaticDataFetcher("Eh?"))
211-
.build();
212-
213-
GraphQLSchema graphQLSchema = GraphQLSchema.newSchema()
214-
.query(query)
215-
.codeRegistry(codeRegistry)
216-
//.additionalDirective(Directives.DeferDirective)
217-
.build();
210+
GraphQLObjectType query = newObject().name("query")
211+
.field(newFieldDefinition().name("hello")
212+
.type(Scalars.GraphQLString)
213+
.dataFetcher(new StaticDataFetcher("world")))
214+
.field(newFieldDefinition().name("hello2")
215+
.type(Scalars.GraphQLString))
216+
.field(newFieldDefinition().name("hello3")
217+
.type(newObject()
218+
.name("Hello3")
219+
.field(newFieldDefinition().name("canada")
220+
.type(Scalars.GraphQLString))
221+
.field(newFieldDefinition().name("america")
222+
.type(Scalars.GraphQLString))))
223+
.build();
224+
225+
GraphQLCodeRegistry codeRegistry = newCodeRegistry().dataFetcher(coordinates(query.getName(), "hello2"),
226+
new StaticDataFetcher("world2"))
227+
.dataFetcher(coordinates(query.getName(), "hello3"),
228+
new StaticDataFetcher(emptyMap()))
229+
.dataFetcher(coordinates("Hello3", "america"),
230+
new StaticDataFetcher("Hi!"))
231+
.dataFetcher(coordinates("Hello3", "canada"),
232+
new StaticDataFetcher("Eh?"))
233+
.build();
234+
235+
GraphQLSchema graphQLSchema = newSchema().query(query)
236+
.codeRegistry(codeRegistry)
237+
.build();
218238

219239
registry.register(graphQLSchema);
220240
}
221241
}
242+
243+
@Component
244+
static class GraphQLSchemaGeneratorConfigurer implements GraphQLSchemaConfigurer {
245+
246+
@Value("classpath:activiti.graphqls")
247+
private Resource schemaResource;
248+
249+
@Override
250+
public void configure(GraphQLShemaRegistration registry) {
251+
File schemaFile = null;
252+
try {
253+
schemaFile = schemaResource.getFile();
254+
} catch (IOException e) {
255+
throw new RuntimeException(e);
256+
}
257+
258+
TypeDefinitionRegistry typeRegistry = new SchemaParser().parse(schemaFile);
259+
260+
Supplier<Map> generator = () -> new LinkedHashMap() {{
261+
put("id", UUID.randomUUID());
262+
put("timestamp", Instant.now().toEpochMilli());
263+
put("entity", emptyMap());
264+
}};
265+
266+
DataFetcher<Flux<List<Map>>> dataFetcher = new StaticDataFetcher(Flux.fromStream(Stream.generate(generator))
267+
.delayElements(Duration.ofMillis(10))
268+
.take(100)
269+
.buffer(10));
270+
271+
GraphQLCodeRegistry codeRegistry = newCodeRegistry().dataFetcher(coordinates("Subscription",
272+
"engineEvents"),
273+
dataFetcher)
274+
.build();
275+
276+
RuntimeWiring.Builder wiring = newRuntimeWiring().codeRegistry(codeRegistry)
277+
.scalar(GraphQLScalarType.newScalar()
278+
.name("ObjectScalar")
279+
.description("An object scalar")
280+
.coercing(new JavaScalars.GraphQLObjectCoercing())
281+
.build())
282+
.scalar(ExtendedScalars.GraphQLLong)
283+
.transformer(new JavaScalarsWiringPostProcessor());
284+
285+
registry.register(new SchemaGenerator().makeExecutableSchema(typeRegistry,
286+
wiring.build()));
287+
}
288+
}
289+
222290
}
223291

224292
@Test
@@ -279,7 +347,24 @@ public void annotatedSchemaConfigurer() {
279347
assertThat(mutation.toString()).isEqualTo("{salut=Salut, dude!}");
280348
assertThat(query.toString()).isEqualTo("{greeting={value=Hi, dude!}}");
281349
}
282-
350+
351+
@Test
352+
public void schemaGeneratorConfigurer() {
353+
// given
354+
GraphQL graphQL = GraphQL.newGraphQL(graphQLSchema).build();
355+
356+
// when
357+
ExecutionResult result = graphQL.execute("subscription { engineEvents { id, timestamp, entity } }");
358+
359+
Publisher<ExecutionResult> source = result.getData();
360+
361+
// then
362+
StepVerifier.create(source)
363+
.expectSubscription()
364+
.expectNextCount(10)
365+
.verifyComplete();
366+
}
367+
283368

284369
@Test
285370
public void defaultConfigurationProperties() {

0 commit comments

Comments
 (0)