Skip to content

Commit de7edcc

Browse files
authored
Merge branch 'master' into renovate/org.apache.maven.surefire-surefire-junit4-3.x
2 parents 0f94569 + 8ab25b6 commit de7edcc

File tree

5 files changed

+86
-3
lines changed

5 files changed

+86
-3
lines changed

src/main/kotlin/graphql/kickstart/tools/SchemaParserOptions.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package graphql.kickstart.tools
33
import com.fasterxml.jackson.databind.ObjectMapper
44
import graphql.kickstart.tools.proxy.*
55
import graphql.kickstart.tools.relay.RelayConnectionFactory
6+
import graphql.kickstart.tools.resolver.MissingResolverDataFetcherProvider
67
import graphql.kickstart.tools.util.JavaType
78
import graphql.kickstart.tools.util.ParameterizedTypeImpl
89
import graphql.schema.DataFetcher
@@ -23,7 +24,9 @@ data class SchemaParserOptions internal constructor(
2324
val contextClass: Class<*>?,
2425
val genericWrappers: List<GenericWrapper>,
2526
val allowUnimplementedResolvers: Boolean,
27+
@Deprecated("Use missingResolverDataFetcherProvider instead.")
2628
val missingResolverDataFetcher: DataFetcher<Any?>?,
29+
val missingResolverDataFetcherProvider: MissingResolverDataFetcherProvider?,
2730
val objectMapperProvider: PerFieldObjectMapperProvider,
2831
val proxyHandlers: List<ProxyHandler>,
2932
val inputArgumentOptionalDetectOmission: Boolean,
@@ -53,6 +56,7 @@ data class SchemaParserOptions internal constructor(
5356
private var useDefaultGenericWrappers = true
5457
private var allowUnimplementedResolvers = false
5558
private var missingResolverDataFetcher: DataFetcher<Any?>? = null
59+
private var missingResolverDataFetcherProvider: MissingResolverDataFetcherProvider? = null
5660
private var objectMapperProvider: PerFieldObjectMapperProvider = PerFieldConfiguringObjectMapperProvider()
5761
private val proxyHandlers: MutableList<ProxyHandler> = mutableListOf(Spring4AopProxyHandler(), GuiceAopProxyHandler(), JavassistProxyHandler(), WeldProxyHandler())
5862
private var inputArgumentOptionalDetectOmission = false
@@ -88,10 +92,15 @@ data class SchemaParserOptions internal constructor(
8892
this.allowUnimplementedResolvers = allowUnimplementedResolvers
8993
}
9094

95+
@Deprecated("Use missingResolverDataFetcherProvider instead.")
9196
fun missingResolverDataFetcher(missingResolverDataFetcher: DataFetcher<Any?>?) = this.apply {
9297
this.missingResolverDataFetcher = missingResolverDataFetcher
9398
}
9499

100+
fun missingResolverDataFetcherProvider(missingResolverDataFetcherProvider: MissingResolverDataFetcherProvider?) = this.apply {
101+
this.missingResolverDataFetcherProvider = missingResolverDataFetcherProvider
102+
}
103+
95104
fun inputArgumentOptionalDetectOmission(inputArgumentOptionalDetectOmission: Boolean) = this.apply {
96105
this.inputArgumentOptionalDetectOmission = inputArgumentOptionalDetectOmission
97106
}
@@ -175,6 +184,7 @@ data class SchemaParserOptions internal constructor(
175184
wrappers,
176185
allowUnimplementedResolvers,
177186
missingResolverDataFetcher,
187+
missingResolverDataFetcherProvider,
178188
objectMapperProvider,
179189
proxyHandlers,
180190
inputArgumentOptionalDetectOmission,

src/main/kotlin/graphql/kickstart/tools/resolver/FieldResolverScanner.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,9 @@ internal class FieldResolverScanner(val options: SchemaParserOptions) {
7272
}
7373

7474
private fun missingFieldResolver(field: FieldDefinition, searches: List<Search>, scanProperties: Boolean): FieldResolver {
75-
return if (options.allowUnimplementedResolvers || options.missingResolverDataFetcher != null) {
75+
return if (options.allowUnimplementedResolvers
76+
|| options.missingResolverDataFetcher != null
77+
|| options.missingResolverDataFetcherProvider != null) {
7678
if (options.allowUnimplementedResolvers) {
7779
log.warn("Missing resolver for field: $field")
7880
}

src/main/kotlin/graphql/kickstart/tools/resolver/MissingFieldResolver.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ internal class MissingFieldResolver(
1111
options: SchemaParserOptions
1212
) : FieldResolver(field, FieldResolverScanner.Search(Any::class.java, MissingResolverInfo(), null), options, Any::class.java) {
1313

14+
private val missingResolverDataFetcherProvider: MissingResolverDataFetcherProvider = options.missingResolverDataFetcherProvider
15+
?: MissingResolverDataFetcherProvider {
16+
_, options -> options.missingResolverDataFetcher ?: DataFetcher<Any> { TODO("Schema resolver not implemented") }
17+
}
1418
override fun scanForMatches(): List<TypeClassMatcher.PotentialMatch> = listOf()
15-
override fun createDataFetcher(): DataFetcher<*> =
16-
options.missingResolverDataFetcher ?: DataFetcher<Any> { TODO("Schema resolver not implemented") }
19+
override fun createDataFetcher(): DataFetcher<*> = missingResolverDataFetcherProvider.createDataFetcher(field, options)
1720
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package graphql.kickstart.tools.resolver
2+
3+
import graphql.kickstart.tools.SchemaParserOptions
4+
import graphql.language.FieldDefinition
5+
import graphql.schema.DataFetcher
6+
7+
/**
8+
* Provider for missing resolver data fetchers.
9+
*/
10+
fun interface MissingResolverDataFetcherProvider {
11+
fun createDataFetcher(field: FieldDefinition, options: SchemaParserOptions): DataFetcher<*>
12+
}

src/test/kotlin/graphql/kickstart/tools/MissingFieldResolverTest.kt

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package graphql.kickstart.tools
22

33
import graphql.GraphQL
44
import graphql.kickstart.tools.resolver.FieldResolverError
5+
import graphql.kickstart.tools.resolver.MissingResolverDataFetcherProvider
6+
import graphql.language.FieldDefinition
57
import graphql.schema.DataFetcher
68
import graphql.schema.DataFetchingEnvironment
79
import org.junit.Test
@@ -65,9 +67,63 @@ class MissingFieldResolverTest {
6567
assertEquals(result.getData(), expected)
6668
}
6769

70+
@Test
71+
fun `should call missing resolver data fetcher provider if provided`() {
72+
val missingResolverDataFetcherProvider = TestMissingResolverDataFetcherProvider();
73+
val options = SchemaParserOptions.newOptions()
74+
.missingResolverDataFetcherProvider(missingResolverDataFetcherProvider)
75+
.build();
76+
val schema = SchemaParser.newParser()
77+
.schemaString(
78+
"""
79+
type Query {
80+
implementedField(input: String): String
81+
missingField(input: Int): Int
82+
}
83+
"""
84+
)
85+
.resolvers(object : GraphQLQueryResolver {
86+
fun implementedField(input: Optional<String>) = input.toString()
87+
})
88+
.options(options)
89+
.build()
90+
.makeExecutableSchema()
91+
92+
val gql = GraphQL.newGraphQL(schema).build()
93+
94+
val result = gql.execute(
95+
"""
96+
query {
97+
implementedField(input: "test-value")
98+
missingField(input: 1)
99+
}
100+
""")
101+
102+
val expected = mapOf(
103+
"implementedField" to "Optional[test-value]",
104+
"missingField" to 1
105+
)
106+
107+
assertEquals(result.getData(), expected)
108+
109+
assertEquals(missingResolverDataFetcherProvider.field?.name, "missingField")
110+
assertEquals(missingResolverDataFetcherProvider.options, options)
111+
}
112+
68113
class TestMissingResolverDataFetcher : DataFetcher<Any?> {
69114
override fun get(env: DataFetchingEnvironment?): Any? {
70115
return env?.getArgument("input")
71116
}
72117
}
118+
119+
class TestMissingResolverDataFetcherProvider : MissingResolverDataFetcherProvider {
120+
var field: FieldDefinition? = null
121+
var options: SchemaParserOptions? = null
122+
123+
override fun createDataFetcher(field: FieldDefinition, options: SchemaParserOptions): DataFetcher<*> {
124+
this.field = field;
125+
this.options = options;
126+
return TestMissingResolverDataFetcher()
127+
}
128+
}
73129
}

0 commit comments

Comments
 (0)