Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add schema rebuild coverage for union and interface references
  • Loading branch information
andimarek committed May 20, 2026
commit 78af7584413a0d8861a68e49eec8b1279857b0f8
91 changes: 91 additions & 0 deletions src/test/groovy/graphql/schema/impl/SchemaUtilTest.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,40 @@ class SchemaUtilTest extends Specification {
transformedSchema.getObjectType("Person").interfaces == [node]
}

@Issue("https://github.com/graphql-java/graphql-java/issues/3384")
def "can rebuild schema after removing root type that made a union member reachable"() {
given:
def schema = issue3384UnionSchema()
def cat = schema.getObjectType("Cat")

when:
def rebuiltSchema = newSchema(schema)
.mutation((GraphQLObjectType) null)
.build()

then:
rebuiltSchema.getMutationType() == null
rebuiltSchema.getType("Cat") == cat
rebuiltSchema.getType("Pet").types == [cat]
}

@Issue("https://github.com/graphql-java/graphql-java/issues/3384")
def "can rebuild schema after removing root type that made an interface implemented by another interface reachable"() {
given:
def schema = issue3384InterfaceInheritanceSchema()
def node = schema.getType("Node")

when:
def rebuiltSchema = newSchema(schema)
.mutation((GraphQLObjectType) null)
.build()

then:
rebuiltSchema.getMutationType() == null
rebuiltSchema.getType("Node") == node
rebuiltSchema.getType("NamedNode").interfaces == [node]
}

private GraphQLSchema issue3384Schema() {
def node = newInterface()
.name("Node")
Expand Down Expand Up @@ -267,6 +301,63 @@ class SchemaUtilTest extends Specification {
.build()
}

private GraphQLSchema issue3384UnionSchema() {
def cat = newObject()
.name("Cat")
.field(newFieldDefinition().name("name").type(GraphQLString))
.build()
def pet = GraphQLUnionType.newUnionType()
.name("Pet")
.possibleType(typeRef("Cat"))
.build()
def query = newObject()
.name("Query")
.field(newFieldDefinition().name("pet").type(pet))
.build()
def mutation = newObject()
.name("Mutation")
.field(newFieldDefinition().name("cat").type(cat))
.build()
def codeRegistry = GraphQLCodeRegistry.newCodeRegistry()
.typeResolver(pet, { env -> cat })
.build()
return newSchema()
.query(query)
.mutation(mutation)
.codeRegistry(codeRegistry)
.build()
}

private GraphQLSchema issue3384InterfaceInheritanceSchema() {
def node = newInterface()
.name("Node")
.field(newFieldDefinition().name("id").type(GraphQLString))
.build()
def namedNode = newInterface()
.name("NamedNode")
.withInterface(typeRef("Node"))
.field(newFieldDefinition().name("id").type(GraphQLString))
.field(newFieldDefinition().name("name").type(GraphQLString))
.build()
def query = newObject()
.name("Query")
.field(newFieldDefinition().name("node").type(namedNode))
.build()
def mutation = newObject()
.name("Mutation")
.field(newFieldDefinition().name("node").type(node))
.build()
def codeRegistry = GraphQLCodeRegistry.newCodeRegistry()
.typeResolver(node, { env -> null })
.typeResolver(namedNode, { env -> null })
.build()
return newSchema()
.query(query)
.mutation(mutation)
.codeRegistry(codeRegistry)
.build()
}

def "redefined types are caught"() {
when:
final GraphQLInputObjectType attributeListInputObjectType = newInputObject().name("attributes")
Expand Down