Skip to content

Commit

Permalink
Merge pull request #106 from Netflix/fix/recursive-input-types
Browse files Browse the repository at this point in the history
Fix to prevent stackoverflow when a cycle in an input type exists.
  • Loading branch information
paulbakker authored Apr 20, 2021
2 parents 9fced2c + 3e47a7e commit 0d9531b
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,16 +42,18 @@ class RequiredTypeCollector(

NodeTraverser().postOrder(
object : NodeVisitorStub() {
val visitedTypes = mutableSetOf<String>()

override fun visitInputObjectTypeDefinition(
node: InputObjectTypeDefinition,
context: TraverserContext<Node<Node<*>>>
): TraversalControl {
required += node.name

node.inputValueDefinitions.forEach {
node.inputValueDefinitions.filter { !visitedTypes.contains(it.name) }.forEach {
visitedTypes.add(it.name)
it.type.findTypeDefinition(document)?.accept(context, this)
}

return TraversalControl.CONTINUE
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,42 @@ class ClientApiGenTest {
assertCompilesJava(codeGenResult.clientProjections.plus(codeGenResult.queryTypes).plus(codeGenResult.dataTypes))
}

@Test
fun generateRecursiveInputTypes() {

val schema = """
type Query {
movies(filter: MovieQuery): [String]
}
input MovieQuery {
booleanQuery: BooleanQuery!
titleFilter: String
}
input BooleanQuery {
first: MovieQuery!
second: MovieQuery!
}
""".trimIndent()

val codeGenResult = CodeGen(
CodeGenConfig(
schemas = setOf(schema),
packageName = basePackageName,
generateDataTypes = false,
generateClientApi = true,
includeQueries = mutableSetOf("movies")
)
).generate() as CodeGenResult

assertThat(codeGenResult.dataTypes.size).isEqualTo(2)
assertThat(codeGenResult.dataTypes[0].typeSpec.name).isEqualTo("MovieQuery")
assertThat(codeGenResult.dataTypes[1].typeSpec.name).isEqualTo("BooleanQuery")

assertCompilesJava(codeGenResult.dataTypes)
}

@Test
fun generateMutationAddsNullChecksDuringInit() {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,42 @@ class KotlinClientApiGenTest {
assertCompilesKotlin(codeGenResult.clientProjections)
}

@Test
fun generateRecursiveInputTypes() {

val schema = """
type Query {
movies(filter: MovieQuery): [String]
}
input MovieQuery {
booleanQuery: BooleanQuery!
titleFilter: String
}
input BooleanQuery {
first: MovieQuery!
second: MovieQuery!
}
""".trimIndent()

val codeGenResult = CodeGen(
CodeGenConfig(
schemas = setOf(schema),
packageName = basePackageName,
language = Language.KOTLIN,
generateClientApi = true,
)
).generate() as KotlinCodeGenResult

assertThat(codeGenResult.dataTypes.size).isEqualTo(2)
val movieQuery = codeGenResult.dataTypes[0].members[0] as TypeSpec
assertThat(movieQuery.name).isEqualTo("MovieQuery")

val booleanQuery = codeGenResult.dataTypes[1].members[0] as TypeSpec
assertThat(booleanQuery.name).isEqualTo("BooleanQuery")
}

@Test
fun interfaceReturnTypes() {

Expand Down

0 comments on commit 0d9531b

Please sign in to comment.