Skip to content

Commit 0774906

Browse files
committed
Increase coverage and fix sonar issues in osgi
1 parent bd73fc6 commit 0774906

File tree

3 files changed

+207
-41
lines changed

3 files changed

+207
-41
lines changed

graphql-java-servlet/src/main/java/graphql/kickstart/servlet/OsgiGraphQLHttpServlet.java

+29-29
Original file line numberDiff line numberDiff line change
@@ -147,38 +147,63 @@ public void unbindTypesProvider(GraphQLTypesProvider typesProvider) {
147147

148148
@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
149149
public void bindServletListener(GraphQLServletListener listener) {
150-
this.addListener(listener);
150+
schemaBuilder.add(listener);
151151
}
152152

153153
public void unbindServletListener(GraphQLServletListener listener) {
154-
this.removeListener(listener);
154+
schemaBuilder.remove(listener);
155155
}
156156

157157
@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC)
158-
public void setContextProvider(GraphQLServletContextBuilder contextBuilder) {
158+
public void setContextBuilder(GraphQLServletContextBuilder contextBuilder) {
159159
schemaBuilder.setContextBuilder(contextBuilder);
160160
}
161161

162-
public void unsetContextProvider(GraphQLServletContextBuilder contextBuilder) {
162+
public void unsetContextBuilder(GraphQLServletContextBuilder contextBuilder) {
163163
schemaBuilder.setContextBuilder(new DefaultGraphQLServletContextBuilder());
164164
}
165165

166+
@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC)
167+
public void setRootObjectBuilder(GraphQLServletRootObjectBuilder rootObjectBuilder) {
168+
schemaBuilder.setRootObjectBuilder(rootObjectBuilder);
169+
}
170+
166171
public void unsetRootObjectBuilder(GraphQLRootObjectBuilder rootObjectBuilder) {
167172
schemaBuilder.setRootObjectBuilder(new DefaultGraphQLRootObjectBuilder());
168173
}
169174

175+
@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY)
176+
public void setExecutionStrategyProvider(ExecutionStrategyProvider provider) {
177+
schemaBuilder.setExecutionStrategyProvider(provider);
178+
}
179+
170180
public void unsetExecutionStrategyProvider(ExecutionStrategyProvider provider) {
171181
schemaBuilder.setExecutionStrategyProvider(new DefaultExecutionStrategyProvider());
172182
}
173183

184+
@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY)
185+
public void setInstrumentationProvider(InstrumentationProvider provider) {
186+
schemaBuilder.setInstrumentationProvider(provider);
187+
}
188+
174189
public void unsetInstrumentationProvider(InstrumentationProvider provider) {
175190
schemaBuilder.setInstrumentationProvider(new NoOpInstrumentationProvider());
176191
}
177192

193+
@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY)
194+
public void setErrorHandler(GraphQLErrorHandler errorHandler) {
195+
schemaBuilder.setErrorHandler(errorHandler);
196+
}
197+
178198
public void unsetErrorHandler(GraphQLErrorHandler errorHandler) {
179199
schemaBuilder.setErrorHandler(new DefaultGraphQLErrorHandler());
180200
}
181201

202+
@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY)
203+
public void setPreparsedDocumentProvider(PreparsedDocumentProvider preparsedDocumentProvider) {
204+
schemaBuilder.setPreparsedDocumentProvider(preparsedDocumentProvider);
205+
}
206+
182207
public void unsetPreparsedDocumentProvider(PreparsedDocumentProvider preparsedDocumentProvider) {
183208
schemaBuilder.setPreparsedDocumentProvider(NoOpPreparsedDocumentProvider.INSTANCE);
184209
}
@@ -194,31 +219,6 @@ public void unbindCodeRegistryProvider(GraphQLCodeRegistryProvider graphQLCodeRe
194219
updateSchema();
195220
}
196221

197-
@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC)
198-
public void setRootObjectBuilder(GraphQLServletRootObjectBuilder rootObjectBuilder) {
199-
schemaBuilder.setRootObjectBuilder(rootObjectBuilder);
200-
}
201-
202-
@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY)
203-
public void setExecutionStrategyProvider(ExecutionStrategyProvider provider) {
204-
schemaBuilder.setExecutionStrategyProvider(provider);
205-
}
206-
207-
@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY)
208-
public void setInstrumentationProvider(InstrumentationProvider provider) {
209-
schemaBuilder.setInstrumentationProvider(provider);
210-
}
211-
212-
@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY)
213-
public void setErrorHandler(GraphQLErrorHandler errorHandler) {
214-
schemaBuilder.setErrorHandler(errorHandler);
215-
}
216-
217-
@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY)
218-
public void setPreparsedDocumentProvider(PreparsedDocumentProvider preparsedDocumentProvider) {
219-
schemaBuilder.setPreparsedDocumentProvider(preparsedDocumentProvider);
220-
}
221-
222222
@interface Config {
223223

224224
int schema_update_delay() default 0;

graphql-java-servlet/src/main/java/graphql/kickstart/servlet/OsgiSchemaBuilder.java

+11
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import graphql.kickstart.servlet.context.DefaultGraphQLServletContextBuilder;
2121
import graphql.kickstart.servlet.context.GraphQLServletContextBuilder;
2222
import graphql.kickstart.servlet.core.DefaultGraphQLRootObjectBuilder;
23+
import graphql.kickstart.servlet.core.GraphQLServletListener;
2324
import graphql.kickstart.servlet.core.GraphQLServletRootObjectBuilder;
2425
import graphql.kickstart.servlet.input.GraphQLInvocationInputFactory;
2526
import graphql.kickstart.servlet.osgi.GraphQLCodeRegistryProvider;
@@ -49,6 +50,7 @@ class OsgiSchemaBuilder {
4950
private final List<GraphQLMutationProvider> mutationProviders = new ArrayList<>();
5051
private final List<GraphQLSubscriptionProvider> subscriptionProviders = new ArrayList<>();
5152
private final List<GraphQLTypesProvider> typesProviders = new ArrayList<>();
53+
private final List<GraphQLServletListener> listeners = new ArrayList<>();
5254

5355
private GraphQLServletContextBuilder contextBuilder = new DefaultGraphQLServletContextBuilder();
5456
private GraphQLServletRootObjectBuilder rootObjectBuilder = new DefaultGraphQLRootObjectBuilder();
@@ -195,6 +197,7 @@ GraphQLConfiguration buildConfiguration() {
195197
.with(buildInvocationInputFactory())
196198
.with(buildQueryInvoker())
197199
.with(buildObjectMapper())
200+
.with(listeners)
198201
.build();
199202
}
200203

@@ -217,4 +220,12 @@ private GraphQLObjectMapper buildObjectMapper() {
217220
.withGraphQLErrorHandler(errorHandler)
218221
.build();
219222
}
223+
224+
void add(GraphQLServletListener listener) {
225+
listeners.add(listener);
226+
}
227+
228+
void remove(GraphQLServletListener listener) {
229+
listeners.remove(listener);
230+
}
220231
}

graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy

+167-12
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
package graphql.kickstart.servlet
22

33
import graphql.AssertException
4-
import graphql.Scalars
54
import graphql.annotations.annotationTypes.GraphQLField
65
import graphql.annotations.annotationTypes.GraphQLName
76
import graphql.annotations.processor.GraphQLAnnotations
8-
import graphql.kickstart.servlet.osgi.GraphQLCodeRegistryProvider
9-
import graphql.kickstart.servlet.osgi.GraphQLMutationProvider
10-
import graphql.kickstart.servlet.osgi.GraphQLQueryProvider
11-
import graphql.kickstart.servlet.osgi.GraphQLSubscriptionProvider
12-
import graphql.schema.GraphQLCodeRegistry
13-
import graphql.schema.GraphQLFieldDefinition
14-
import graphql.schema.GraphQLInterfaceType
7+
import graphql.kickstart.execution.GraphQLRequest
8+
import graphql.kickstart.execution.config.ExecutionStrategyProvider
9+
import graphql.kickstart.execution.context.DefaultGraphQLContext
10+
import graphql.kickstart.execution.context.GraphQLContext
11+
import graphql.kickstart.servlet.context.GraphQLServletContextBuilder
12+
import graphql.kickstart.servlet.core.GraphQLServletListener
13+
import graphql.kickstart.servlet.core.GraphQLServletRootObjectBuilder
14+
import graphql.kickstart.servlet.osgi.*
15+
import graphql.schema.*
16+
import org.dataloader.DataLoaderRegistry
1517
import spock.lang.Specification
1618

17-
import java.lang.annotation.Annotation
18-
1919
import static graphql.Scalars.GraphQLInt
2020
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition
2121

@@ -82,12 +82,23 @@ class OsgiGraphQLHttpServletSpec extends Specification {
8282
servlet.bindMutationProvider(mutationProvider)
8383
then:
8484
servlet.getConfiguration().getInvocationInputFactory().getSchemaProvider().getSchema().getMutationType().getFieldDefinition("int").getType() == GraphQLInt
85-
servlet.getConfiguration().getInvocationInputFactory().getSchemaProvider().getReadOnlySchema(null).getMutationType() == null
85+
servlet.getConfiguration().getInvocationInputFactory().getSchemaProvider().getReadOnlySchema().getMutationType() == null
8686

8787
when:
8888
servlet.unbindMutationProvider(mutationProvider)
8989
then:
9090
servlet.getConfiguration().getInvocationInputFactory().getSchemaProvider().getSchema().getMutationType() == null
91+
92+
when:
93+
servlet.bindProvider(mutationProvider)
94+
then:
95+
servlet.getConfiguration().getInvocationInputFactory().getSchemaProvider().getSchema().getMutationType().getFieldDefinition("int").getType() == GraphQLInt
96+
servlet.getConfiguration().getInvocationInputFactory().getSchemaProvider().getReadOnlySchema().getMutationType() == null
97+
98+
when:
99+
servlet.unbindProvider(mutationProvider)
100+
then:
101+
servlet.getConfiguration().getInvocationInputFactory().getSchemaProvider().getSchema().getMutationType() == null
91102
}
92103

93104
static class TestSubscriptionProvider implements GraphQLSubscriptionProvider {
@@ -124,6 +135,17 @@ class OsgiGraphQLHttpServletSpec extends Specification {
124135
servlet.unbindSubscriptionProvider(subscriptionProvider)
125136
then:
126137
servlet.getConfiguration().getInvocationInputFactory().getSchemaProvider().getSchema().getSubscriptionType() == null
138+
139+
when:
140+
servlet.bindProvider(subscriptionProvider)
141+
then:
142+
def subscription2 = servlet.getConfiguration().getInvocationInputFactory().getSchemaProvider().getReadOnlySchema().getSubscriptionType().getFieldDefinition("subscription")
143+
subscription2.getType().getName() == "subscription"
144+
145+
when:
146+
servlet.unbindProvider(subscriptionProvider)
147+
then:
148+
servlet.getConfiguration().getInvocationInputFactory().getSchemaProvider().getSchema().getSubscriptionType() == null
127149
}
128150

129151
static class TestCodeRegistryProvider implements GraphQLCodeRegistryProvider {
@@ -149,6 +171,18 @@ class OsgiGraphQLHttpServletSpec extends Specification {
149171
servlet.getConfiguration().getInvocationInputFactory().getSchemaProvider().getSchema().getCodeRegistry().getTypeResolver(GraphQLInterfaceType.newInterface().name("Type").build())
150172
then:
151173
thrown AssertException
174+
175+
when:
176+
servlet.bindProvider(codeRegistryProvider)
177+
servlet.getConfiguration().getInvocationInputFactory().getSchemaProvider().getSchema().getCodeRegistry().getTypeResolver(GraphQLInterfaceType.newInterface().name("Type").build())
178+
then:
179+
notThrown AssertException
180+
181+
when:
182+
servlet.unbindProvider(codeRegistryProvider)
183+
servlet.getConfiguration().getInvocationInputFactory().getSchemaProvider().getSchema().getCodeRegistry().getTypeResolver(GraphQLInterfaceType.newInterface().name("Type").build())
184+
then:
185+
thrown AssertException
152186
}
153187

154188
def "schema update delay throws no exception"() {
@@ -181,9 +215,130 @@ class OsgiGraphQLHttpServletSpec extends Specification {
181215
query.getType().name == "query"
182216

183217
when:
184-
query = servlet.getConfiguration().getInvocationInputFactory().getSchemaProvider().getReadOnlySchema(null).getQueryType().getFieldDefinition("query")
218+
query = servlet.getConfiguration().getInvocationInputFactory().getSchemaProvider().getReadOnlySchema().getQueryType().getFieldDefinition("query")
185219

186220
then:
187221
query.getType().name == "query"
222+
223+
when:
224+
servlet.unbindProvider(queryProvider)
225+
then:
226+
null != servlet.getConfiguration().getInvocationInputFactory().getSchemaProvider().getSchema().getQueryType().getFieldDefinition("_empty")
227+
}
228+
229+
def "type provider adds types"() {
230+
setup:
231+
def servlet = new OsgiGraphQLHttpServlet()
232+
def typesProvider = Mock(GraphQLTypesProvider)
233+
def coercing = Mock(Coercing)
234+
typesProvider.types >> [GraphQLScalarType.newScalar().name("Upload").coercing(coercing).build()]
235+
236+
when:
237+
servlet.bindTypesProvider(typesProvider)
238+
239+
then:
240+
def type = servlet.configuration.invocationInputFactory.schemaProvider.schema.getType("Upload")
241+
type != null
242+
type.name == "Upload"
243+
type instanceof GraphQLScalarType
244+
def scalarType = (GraphQLScalarType) type
245+
scalarType.coercing == coercing
246+
247+
when:
248+
servlet.unbindTypesProvider(typesProvider)
249+
250+
then:
251+
null == servlet.configuration.invocationInputFactory.schemaProvider.schema.getType("Upload")
252+
253+
when:
254+
servlet.bindProvider(typesProvider)
255+
then:
256+
servlet.configuration.invocationInputFactory.schemaProvider.schema.getType("Upload").name == "Upload"
257+
258+
when:
259+
servlet.unbindProvider(typesProvider)
260+
then:
261+
null == servlet.configuration.invocationInputFactory.schemaProvider.schema.getType("Upload")
262+
}
263+
264+
def "servlet listener is bound and unbound"() {
265+
setup:
266+
def servlet = new OsgiGraphQLHttpServlet()
267+
def listener = Mock(GraphQLServletListener)
268+
269+
when:
270+
servlet.bindServletListener(listener)
271+
then:
272+
servlet.configuration.listeners.contains(listener)
273+
274+
when:
275+
servlet.unbindServletListener(listener)
276+
then:
277+
!servlet.configuration.listeners.contains(listener)
278+
}
279+
280+
def "context builder is bound and unbound"() {
281+
setup:
282+
def servlet = new OsgiGraphQLHttpServlet()
283+
def context = Mock(GraphQLContext)
284+
context.getDataLoaderRegistry() >> new DataLoaderRegistry()
285+
context.getSubject() >> Optional.empty()
286+
def contextBuilder = Mock(GraphQLServletContextBuilder)
287+
contextBuilder.build() >> context
288+
def request = GraphQLRequest.createIntrospectionRequest()
289+
290+
when:
291+
servlet.setContextBuilder(contextBuilder)
292+
then:
293+
def invocationInput = servlet.configuration.invocationInputFactory.create(request)
294+
invocationInput.executionInput.context == context
295+
296+
when:
297+
servlet.unsetContextBuilder(contextBuilder)
298+
then:
299+
servlet.configuration.invocationInputFactory.create(request).executionInput.context instanceof DefaultGraphQLContext
300+
}
301+
302+
def "root object builder is bound and unbound"() {
303+
setup:
304+
def servlet = new OsgiGraphQLHttpServlet()
305+
def rootObject = Mock(Object)
306+
def rootObjectBuilder = Mock(GraphQLServletRootObjectBuilder)
307+
rootObjectBuilder.build() >> rootObject
308+
def request = GraphQLRequest.createIntrospectionRequest()
309+
310+
when:
311+
servlet.setRootObjectBuilder(rootObjectBuilder)
312+
then:
313+
def invocationInput = servlet.configuration.invocationInputFactory.create(request)
314+
invocationInput.executionInput.root == rootObject
315+
316+
when:
317+
servlet.unsetRootObjectBuilder(rootObjectBuilder)
318+
then:
319+
servlet.configuration.invocationInputFactory.create(request).executionInput.root != rootObject
320+
}
321+
322+
def "execution strategy is bound and unbound"() {
323+
setup:
324+
def servlet = new OsgiGraphQLHttpServlet()
325+
def executionStrategy = Mock(ExecutionStrategyProvider)
326+
def request = GraphQLRequest.createIntrospectionRequest()
327+
328+
when:
329+
servlet.setExecutionStrategyProvider(executionStrategy)
330+
def invocationInput = servlet.configuration.invocationInputFactory.create(request)
331+
servlet.configuration.graphQLInvoker.query(invocationInput)
332+
333+
then:
334+
1 * executionStrategy.getQueryExecutionStrategy()
335+
336+
when:
337+
servlet.unsetExecutionStrategyProvider(executionStrategy)
338+
def invocationInput2 = servlet.configuration.invocationInputFactory.create(request)
339+
servlet.configuration.graphQLInvoker.query(invocationInput2)
340+
341+
then:
342+
0 * executionStrategy.getQueryExecutionStrategy()
188343
}
189344
}

0 commit comments

Comments
 (0)