Skip to content

Commit 125e59f

Browse files
authored
Improve errors for unions (ExpediaGroup#1273)
1 parent fd84195 commit 125e59f

File tree

3 files changed

+30
-5
lines changed

3 files changed

+30
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* Copyright 2021 Expedia, Inc
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.expediagroup.graphql.generator.exceptions
18+
19+
class InvalidUnionException(type: String) : GraphQLKotlinException("The type $type was specified as a union but had no implementations. A Union type must define one or more member types.")

generator/graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/internal/types/generateUnion.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.expediagroup.graphql.generator.internal.types
1818

1919
import com.expediagroup.graphql.generator.SchemaGenerator
2020
import com.expediagroup.graphql.generator.annotations.GraphQLUnion
21+
import com.expediagroup.graphql.generator.exceptions.InvalidUnionException
2122
import com.expediagroup.graphql.generator.extensions.unwrapType
2223
import com.expediagroup.graphql.generator.internal.extensions.getGraphQLDescription
2324
import com.expediagroup.graphql.generator.internal.extensions.getSimpleName
@@ -49,7 +50,7 @@ private fun generateUnionFromAnnotation(generator: SchemaGenerator, unionAnnotat
4950

5051
val possibleTypes = unionAnnotation.possibleTypes.toList()
5152

52-
return createUnion(generator, builder, possibleTypes)
53+
return createUnion(unionName, generator, builder, possibleTypes)
5354
}
5455

5556
private fun generateUnionFromKClass(generator: SchemaGenerator, kClass: KClass<*>): GraphQLUnionType {
@@ -66,10 +67,14 @@ private fun generateUnionFromKClass(generator: SchemaGenerator, kClass: KClass<*
6667

6768
val types = generator.classScanner.getSubTypesOf(kClass)
6869

69-
return createUnion(generator, builder, types)
70+
return createUnion(name, generator, builder, types)
7071
}
7172

72-
private fun createUnion(generator: SchemaGenerator, builder: GraphQLUnionType.Builder, types: List<KClass<*>>): GraphQLUnionType {
73+
private fun createUnion(typeName: String, generator: SchemaGenerator, builder: GraphQLUnionType.Builder, types: List<KClass<*>>): GraphQLUnionType {
74+
if (types.isEmpty()) {
75+
throw InvalidUnionException(typeName)
76+
}
77+
7378
types.map { generateGraphQLType(generator, it.createType()) }
7479
.forEach {
7580
when (val unwrappedType = it.unwrapType()) {

generator/graphql-kotlin-schema-generator/src/test/kotlin/com/expediagroup/graphql/generator/internal/types/GenerateUnionTest.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import com.expediagroup.graphql.generator.annotations.GraphQLDescription
2020
import com.expediagroup.graphql.generator.annotations.GraphQLName
2121
import com.expediagroup.graphql.generator.annotations.GraphQLUnion
2222
import com.expediagroup.graphql.generator.exceptions.InvalidGraphQLNameException
23+
import com.expediagroup.graphql.generator.exceptions.InvalidUnionException
2324
import com.expediagroup.graphql.generator.test.utils.SimpleDirective
2425
import graphql.schema.GraphQLObjectType
2526
import graphql.schema.GraphQLUnionType
@@ -84,7 +85,7 @@ class GenerateUnionTest : TypeTestHelper() {
8485

8586
@Test
8687
fun `unused unions throw exception`() {
87-
assertFailsWith(graphql.AssertException::class) {
88+
assertFailsWith(InvalidUnionException::class) {
8889
generateUnion(generator, UnusedUnion::class)
8990
}
9091
}
@@ -133,7 +134,7 @@ class GenerateUnionTest : TypeTestHelper() {
133134
@Test
134135
fun `custom union annotation throws if possible types is empty`() {
135136
val annotation = AnnotationUnion::emptyUnion.annotations.first() as GraphQLUnion
136-
assertFailsWith(graphql.AssertException::class) {
137+
assertFailsWith(InvalidUnionException::class) {
137138
generateUnion(generator, Any::class, annotation)
138139
}
139140
}

0 commit comments

Comments
 (0)