Skip to content

Commit 4571cfd

Browse files
smyrickbrennantaylor
authored andcommitted
fix: description of parameters (#118)
1 parent a787b51 commit 4571cfd

File tree

9 files changed

+55
-23
lines changed

9 files changed

+55
-23
lines changed

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import com.expedia.graphql.generator.types.ObjectTypeBuilder
1414
import com.expedia.graphql.generator.types.PropertyTypeBuilder
1515
import com.expedia.graphql.generator.types.ScalarTypeBuilder
1616
import com.expedia.graphql.generator.types.UnionTypeBuilder
17+
import graphql.schema.GraphQLDirective
1718
import graphql.schema.GraphQLInterfaceType
1819
import graphql.schema.GraphQLObjectType
1920
import graphql.schema.GraphQLSchema
@@ -105,7 +106,7 @@ internal class SchemaGenerator(
105106
listTypeBuilder.listType(type, inputType)
106107

107108
internal fun arrayType(type: KType, inputType: Boolean) =
108-
listTypeBuilder.arrayType(type, inputType)
109+
listTypeBuilder.arrayType(type, inputType)
109110

110111
internal fun objectType(kClass: KClass<*>, interfaceType: GraphQLInterfaceType? = null) =
111112
objectTypeBuilder.objectType(kClass, interfaceType)
@@ -125,6 +126,9 @@ internal class SchemaGenerator(
125126
internal fun scalarType(type: KType, annotatedAsID: Boolean = false) =
126127
scalarTypeBuilder.scalarType(type, annotatedAsID)
127128

128-
internal fun directives(element: KAnnotatedElement) =
129-
directiveTypeBuilder.directives(element)
129+
internal fun directives(element: KAnnotatedElement): List<GraphQLDirective> {
130+
val directives = directiveTypeBuilder.directives(element)
131+
state.directives.addAll(directives)
132+
return directives
133+
}
130134
}

src/main/kotlin/com/expedia/graphql/generator/extensions/kClassExtensions.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import kotlin.reflect.KParameter
1010
import kotlin.reflect.KProperty
1111
import kotlin.reflect.full.declaredMemberFunctions
1212
import kotlin.reflect.full.declaredMemberProperties
13+
import kotlin.reflect.full.findParameterByName
1314
import kotlin.reflect.full.isSubclassOf
1415
import kotlin.reflect.full.primaryConstructor
1516

@@ -24,9 +25,7 @@ internal fun KClass<*>.getValidFunctions(hooks: SchemaGeneratorHooks): List<KFun
2425
.filter { func -> functionFilters.all { it.invoke(func) } }
2526

2627
internal fun KClass<*>.findConstructorParamter(name: String): KParameter? =
27-
this.primaryConstructor
28-
?.parameters
29-
?.find { it.name == name }
28+
this.primaryConstructor?.findParameterByName(name)
3029

3130
internal fun KClass<*>.isInterface(): Boolean = this.java.isInterface
3231

src/main/kotlin/com/expedia/graphql/generator/extensions/kParameterExtensions.kt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,11 @@ package com.expedia.graphql.generator.extensions
22

33
import com.expedia.graphql.annotations.GraphQLContext
44
import com.expedia.graphql.exceptions.CouldNotGetNameOfKParameterException
5-
import com.expedia.graphql.exceptions.InvalidInputFieldTypeException
65
import kotlin.reflect.KParameter
76
import kotlin.reflect.full.findAnnotation
87
import kotlin.reflect.jvm.jvmErasure
98

10-
@Throws(InvalidInputFieldTypeException::class)
11-
internal fun KParameter.throwIfUnathorizedInterface() {
12-
if (this.type.jvmErasure.isInterface()) throw InvalidInputFieldTypeException()
13-
}
9+
internal fun KParameter.isInterface() = this.type.jvmErasure.isInterface()
1410

1511
internal fun KParameter.isGraphQLContext() = this.findAnnotation<GraphQLContext>() != null
1612

src/main/kotlin/com/expedia/graphql/generator/types/FunctionTypeBuilder.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ package com.expedia.graphql.generator.types
22

33
import com.expedia.graphql.KotlinDataFetcher
44
import com.expedia.graphql.Parameter
5+
import com.expedia.graphql.exceptions.InvalidInputFieldTypeException
56
import com.expedia.graphql.generator.SchemaGenerator
67
import com.expedia.graphql.generator.TypeBuilder
78
import com.expedia.graphql.generator.extensions.getDeprecationReason
89
import com.expedia.graphql.generator.extensions.getGraphQLDescription
910
import com.expedia.graphql.generator.extensions.getName
1011
import com.expedia.graphql.generator.extensions.isGraphQLContext
11-
import com.expedia.graphql.generator.extensions.throwIfUnathorizedInterface
12+
import com.expedia.graphql.generator.extensions.isInterface
1213
import graphql.schema.DataFetcher
1314
import graphql.schema.GraphQLArgument
1415
import graphql.schema.GraphQLFieldDefinition
@@ -33,7 +34,6 @@ internal class FunctionTypeBuilder(generator: SchemaGenerator) : TypeBuilder(gen
3334

3435
generator.directives(fn).forEach {
3536
builder.withDirective(it)
36-
state.directives.add(it)
3737
}
3838

3939
val args = mutableMapOf<String, Parameter>()
@@ -60,16 +60,20 @@ internal class FunctionTypeBuilder(generator: SchemaGenerator) : TypeBuilder(gen
6060
return config.hooks.onRewireGraphQLType(monadType, graphQLType) as GraphQLFieldDefinition
6161
}
6262

63+
@Throws(InvalidInputFieldTypeException::class)
6364
private fun argument(parameter: KParameter): GraphQLArgument {
64-
parameter.throwIfUnathorizedInterface()
65+
66+
if (parameter.isInterface()) {
67+
throw InvalidInputFieldTypeException()
68+
}
69+
6570
val builder = GraphQLArgument.newArgument()
66-
.name(parameter.name)
67-
.description(parameter.getGraphQLDescription() ?: parameter.type.getGraphQLDescription())
71+
.name(parameter.getName())
72+
.description(parameter.getGraphQLDescription())
6873
.type(graphQLTypeOf(parameter.type, true) as GraphQLInputType)
6974

7075
generator.directives(parameter).forEach {
7176
builder.withDirective(it)
72-
state.directives.add(it)
7377
}
7478

7579
return config.hooks.onRewireGraphQLType(parameter.type, builder.build()) as GraphQLArgument

src/main/kotlin/com/expedia/graphql/generator/types/ObjectTypeBuilder.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ internal class ObjectTypeBuilder(generator: SchemaGenerator) : TypeBuilder(gener
2626

2727
generator.directives(kClass).forEach {
2828
builder.withDirective(it)
29-
state.directives.add(it)
3029
}
3130

3231
if (interfaceType != null) {

src/main/kotlin/com/expedia/graphql/generator/types/PropertyTypeBuilder.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ internal class PropertyTypeBuilder(generator: SchemaGenerator) : TypeBuilder(gen
2525

2626
generator.directives(prop).forEach {
2727
fieldBuilder.withDirective(it)
28-
state.directives.add(it)
2928
}
3029

3130
val field = if (config.dataFetcherFactory != null && prop.isLateinit) {
Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,31 @@
11
package com.expedia.graphql.generator.extensions
22

3+
import com.expedia.graphql.annotations.GraphQLDescription
34
import com.expedia.graphql.exceptions.CouldNotGetNameOfKParameterException
45
import io.mockk.every
56
import io.mockk.mockk
67
import org.junit.jupiter.api.Test
78
import kotlin.reflect.KParameter
8-
import kotlin.reflect.full.primaryConstructor
9+
import kotlin.reflect.full.findParameterByName
910
import kotlin.test.assertEquals
1011
import kotlin.test.assertFailsWith
12+
import kotlin.test.assertNull
1113

1214
internal class KParameterExtensionsKtTest {
1315

16+
@GraphQLDescription("class description")
1417
internal data class MyClass(val foo: String)
1518

19+
internal class Container {
20+
internal fun noDescription(myClass: MyClass) = myClass
21+
22+
internal fun paramDescription(@GraphQLDescription("param description") myClass: MyClass) = myClass
23+
}
24+
1625
@Test
1726
fun getName() {
18-
val param = MyClass::class.primaryConstructor?.parameters?.first()
19-
assertEquals(expected = "foo", actual = param?.getName())
27+
val param = Container::noDescription.findParameterByName("myClass")
28+
assertEquals(expected = "myClass", actual = param?.getName())
2029
}
2130

2231
@Test
@@ -27,4 +36,16 @@ internal class KParameterExtensionsKtTest {
2736
mockParam.getName()
2837
}
2938
}
39+
40+
@Test
41+
fun `parameter description`() {
42+
val param = Container::paramDescription.findParameterByName("myClass")
43+
assertEquals(expected = "param description", actual = param?.getGraphQLDescription())
44+
}
45+
46+
@Test
47+
fun `no description`() {
48+
val param = Container::noDescription.findParameterByName("myClass")
49+
assertNull(param?.getGraphQLDescription())
50+
}
3051
}

src/test/kotlin/com/expedia/graphql/generator/extensions/KTypeExtensionsKtTest.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,21 @@ internal class KTypeExtensionsKtTest {
1818
internal class MyClass {
1919
fun listFun(list: List<String>) = list.joinToString(separator = ",") { it }
2020

21+
fun arrayFun(array: Array<String>) = array.joinToString(separator = ",") { it }
22+
23+
fun primitiveArrayFun(intArray: IntArray) = intArray.joinToString(separator = ",") { it.toString() }
24+
2125
fun stringFun(string: String) = "hello $string"
2226
}
2327

2428
@Test
2529
fun getTypeOfFirstArgument() {
2630
assertEquals(String::class.starProjectedType, MyClass::listFun.findParameterByName("list")?.type?.getTypeOfFirstArgument())
2731

32+
assertEquals(String::class.starProjectedType, MyClass::arrayFun.findParameterByName("array")?.type?.getTypeOfFirstArgument())
33+
34+
assertEquals(Int::class.starProjectedType, MyClass::primitiveArrayFun.findParameterByName("intArray")?.type?.getArrayType())
35+
2836
assertFailsWith(InvalidListTypeException::class) {
2937
MyClass::stringFun.findParameterByName("string")?.type?.getTypeOfFirstArgument()
3038
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ internal open class TypeTestHelper {
5151

5252
directiveTypeBuilder = spyk(DirectiveTypeBuilder(generator))
5353
every { generator.directives(any()) } answers {
54-
directiveTypeBuilder!!.directives(it.invocation.args[0] as KAnnotatedElement)
54+
val directives = directiveTypeBuilder!!.directives(it.invocation.args[0] as KAnnotatedElement)
55+
state.directives.addAll(directives)
56+
directives
5557
}
5658

5759
beforeTest()

0 commit comments

Comments
 (0)