Skip to content

Commit 46ed5c2

Browse files
smyrickdariuszkuc
authored andcommitted
fix: do not cache GraphQLTypeReference (#192)
1 parent 6a9fcef commit 46ed5c2

File tree

3 files changed

+29
-19
lines changed

3 files changed

+29
-19
lines changed

src/main/kotlin/com/expedia/graphql/generator/TypeBuilder.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.expedia.graphql.generator.extensions.wrapInNonNull
99
import com.expedia.graphql.generator.state.KGraphQLType
1010
import com.expedia.graphql.generator.state.TypesCacheKey
1111
import graphql.schema.GraphQLType
12+
import graphql.schema.GraphQLTypeReference
1213
import kotlin.reflect.KClass
1314
import kotlin.reflect.KType
1415

@@ -37,9 +38,11 @@ internal open class TypeBuilder constructor(protected val generator: SchemaGener
3738

3839
val kClass = type.getKClass()
3940
val graphQLType = getGraphQLType(kClass, inputType, type)
40-
val kGraphQLType = KGraphQLType(kClass, graphQLType)
4141

42-
state.cache.put(cacheKey, kGraphQLType)
42+
if (graphQLType !is GraphQLTypeReference) {
43+
val kGraphQLType = KGraphQLType(kClass, graphQLType)
44+
state.cache.put(cacheKey, kGraphQLType)
45+
}
4346

4447
return graphQLType
4548
}

src/test/kotlin/com/expedia/graphql/generator/types/TypeTestHelper.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,15 @@ import kotlin.test.BeforeTest
2828
internal open class TypeTestHelper {
2929
var generator = mockk<SchemaGenerator>()
3030
var config = mockk<SchemaGeneratorConfig>()
31-
var state = spyk(SchemaGeneratorState(listOf("com.expedia.graphql.generator.types")))
32-
var subTypeMapper = spyk(SubTypeMapper(listOf("com.expedia.graphql.generator.types")))
33-
var cache = spyk(TypesCache(listOf("com.expedia.graphql.generator.types")))
31+
var state = spyk(SchemaGeneratorState(listOf("com.expedia.graphql")))
32+
var subTypeMapper = spyk(SubTypeMapper(listOf("com.expedia.graphql")))
33+
var cache = spyk(TypesCache(listOf("com.expedia.graphql")))
3434
var hooks: SchemaGeneratorHooks = NoopSchemaGeneratorHooks()
3535
var dataFetcherFactory: KotlinDataFetcherFactoryProvider = KotlinDataFetcherFactoryProvider(hooks)
3636

3737
private var scalarBuilder: ScalarBuilder? = null
3838
private var objectBuilder: ObjectBuilder? = null
39+
private var listBuilder: ListBuilder? = null
3940
private var interfaceBuilder: InterfaceBuilder? = null
4041
private var directiveBuilder: DirectiveBuilder? = null
4142
private var functionBuilder: FunctionBuilder? = null
@@ -74,6 +75,11 @@ internal open class TypeTestHelper {
7475
objectBuilder!!.objectType(it.invocation.args[0] as KClass<*>, it.invocation.args[1] as GraphQLInterfaceType?)
7576
}
7677

78+
listBuilder = spyk(ListBuilder(generator))
79+
every { generator.listType(any(), any()) } answers {
80+
listBuilder!!.listType(it.invocation.args[0] as KType, it.invocation.args[1] as Boolean)
81+
}
82+
7783
interfaceBuilder = spyk(InterfaceBuilder(generator))
7884
every { generator.interfaceType(any()) } answers {
7985
interfaceBuilder!!.interfaceType(it.invocation.args[0] as KClass<*>)

src/test/kotlin/com/expedia/graphql/test/integration/NodeGraphTest.kt

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,28 @@ package com.expedia.graphql.test.integration
33
import com.expedia.graphql.TopLevelObject
44
import com.expedia.graphql.testSchemaConfig
55
import com.expedia.graphql.toSchema
6+
import graphql.schema.GraphQLObjectType
7+
import graphql.schema.GraphQLTypeReference
68
import org.junit.jupiter.api.Test
79
import kotlin.test.assertEquals
10+
import kotlin.test.assertFalse
811

912
class NodeGraphTest {
1013

1114
@Test
1215
fun nodeGraph() {
13-
val root = Node(id = 0, value = "root", parent = null, children = emptyList())
14-
val nodeA = Node(id = 1, value = "A", parent = root, children = emptyList())
15-
val nodeB = Node(id = 2, value = "B", parent = root, children = emptyList())
16-
val nodeC = Node(id = 3, value = "C", parent = nodeB, children = emptyList())
17-
18-
root.children = listOf(nodeA, nodeB)
19-
nodeB.children = listOf(nodeC)
20-
2116
val queries = listOf(TopLevelObject(NodeQuery()))
2217

2318
val schema = toSchema(queries = queries, config = testSchemaConfig)
2419

2520
assertEquals(expected = 1, actual = schema.queryType.fieldDefinitions.size)
2621
assertEquals(expected = "nodeGraph", actual = schema.queryType.fieldDefinitions.first().name)
22+
23+
val nodeFields = (schema.typeMap["Node"] as? GraphQLObjectType)?.fieldDefinitions
24+
25+
nodeFields?.forEach {
26+
assertFalse(it.type is GraphQLTypeReference, "Node.${it.name} is a GraphQLTypeReference")
27+
}
2728
}
2829
}
2930

@@ -34,16 +35,16 @@ class NodeGraphTest {
3435
data class Node(
3536
val id: Int,
3637
val value: String,
37-
val parent: Node?,
38-
var children: List<Node>
38+
val parent: Node? = null,
39+
var children: List<Node> = emptyList()
3940
)
4041

4142
class NodeQuery {
4243

43-
private val root = Node(id = 0, value = "root", parent = null, children = emptyList())
44-
private val nodeA = Node(id = 1, value = "A", parent = root, children = emptyList())
45-
private val nodeB = Node(id = 2, value = "B", parent = root, children = emptyList())
46-
private val nodeC = Node(id = 3, value = "C", parent = nodeB, children = emptyList())
44+
private val root = Node(id = 0, value = "root")
45+
private val nodeA = Node(id = 1, value = "A", parent = root)
46+
private val nodeB = Node(id = 2, value = "B", parent = root)
47+
private val nodeC = Node(id = 3, value = "C", parent = nodeB)
4748

4849
init {
4950
root.children = listOf(nodeA, nodeB)

0 commit comments

Comments
 (0)