@@ -20,6 +20,7 @@ package com.netflix.graphql.dgs.codegen
2020
2121import com.squareup.kotlinpoet.*
2222import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
23+ import graphql.schema.DataFetchingEnvironment
2324import org.assertj.core.api.Assertions.assertThat
2425import org.assertj.core.api.Assertions.assertThatThrownBy
2526import org.assertj.core.data.Index
@@ -35,6 +36,10 @@ import java.util.stream.Stream.of
3536
3637class KotlinCodeGenTest {
3738
39+ val basePackageName = " com.netflix.graphql.dgs.codegen.tests.generated"
40+ val typesPackageName = " $basePackageName .types"
41+ val datafetchersPackageName = " $basePackageName .datafetchers"
42+
3843 @Test
3944 fun generateDataClassWithStringProperties () {
4045 val schema = """
@@ -68,6 +73,104 @@ class KotlinCodeGenTest {
6873 assertCompilesKotlin(dataTypes)
6974 }
7075
76+ @Test
77+ fun generateDataFetcherInterfaceWithFunction () {
78+ val schema = """
79+ type Query {
80+ people: [Person]
81+ }
82+
83+ type Person {
84+ firstname: String
85+ lastname: String
86+ }
87+ """ .trimIndent()
88+
89+ val dataFetchers = CodeGen (
90+ CodeGenConfig (
91+ schemas = setOf (schema),
92+ packageName = basePackageName,
93+ language = Language .KOTLIN ,
94+ generateDataFetcherInterfaces = true
95+ )
96+ ).generate().kotlinDataFetchers
97+
98+ assertThat(dataFetchers.size).isEqualTo(1 )
99+ assertThat(dataFetchers[0 ].name).isEqualTo(" PeopleDatafetcher" )
100+ assertThat(dataFetchers[0 ].packageName).isEqualTo(datafetchersPackageName)
101+ val type = dataFetchers[0 ].members[0 ] as TypeSpec
102+
103+ assertThat(type.kind).isEqualTo(TypeSpec .Kind .INTERFACE )
104+ assertThat(type.annotations).hasSize(1 ).first().satisfies({
105+ assertThat(it.typeName.toString()).isEqualTo(" com.netflix.graphql.dgs.DgsComponent" )
106+ })
107+ assertThat(type.funSpecs).hasSize(1 )
108+ val fn = type.funSpecs.single()
109+ assertThat(fn.name).isEqualTo(" getPeople" )
110+ val returnType = fn.returnType as ParameterizedTypeName
111+ assertThat(fn.returnType)
112+ assertThat(returnType.rawType.canonicalName).isEqualTo(List ::class .qualifiedName)
113+ assertThat(returnType.typeArguments).hasSize(1 )
114+ val arg0 = returnType.typeArguments.single() as ClassName
115+ assertThat(arg0.canonicalName).isEqualTo(" $typesPackageName .Person" )
116+ assertThat(fn.parameters).hasSize(1 )
117+ val param0 = fn.parameters.single()
118+ assertThat(param0.name).isEqualTo(" dataFetchingEnvironment" )
119+ assertThat((param0.type as ClassName ).canonicalName).isEqualTo(DataFetchingEnvironment ::class .qualifiedName)
120+ assertThat(fn.annotations).hasSize(1 ).first().satisfies({ annotation ->
121+ assertThat(annotation.typeName.toString()).isEqualTo(" com.netflix.graphql.dgs.DgsData" )
122+ assertThat(annotation.members).satisfiesExactly(
123+ { member -> assertThat(member.toString()).isEqualTo(" parentType = DgsConstants.QUERY.TYPE_NAME" ) },
124+ { member -> assertThat(member.toString()).isEqualTo(" field = DgsConstants.QUERY.People" ) }
125+ )
126+ })
127+ }
128+
129+ @Test
130+ fun generateDataFetcherInterfaceWithArgument () {
131+ val schema = """
132+ type Query {
133+ person(name: String): Person
134+ }
135+
136+ type Person {
137+ firstname: String
138+ lastname: String
139+ }
140+ """ .trimIndent()
141+
142+ val dataFetchers = CodeGen (
143+ CodeGenConfig (
144+ schemas = setOf (schema),
145+ packageName = basePackageName,
146+ language = Language .KOTLIN ,
147+ generateDataFetcherInterfaces = true
148+ )
149+ ).generate().kotlinDataFetchers
150+
151+ assertThat(dataFetchers.size).isEqualTo(1 )
152+ assertThat(dataFetchers[0 ].name).isEqualTo(" PersonDatafetcher" )
153+ assertThat(dataFetchers[0 ].packageName).isEqualTo(datafetchersPackageName)
154+ val type = dataFetchers[0 ].members[0 ] as TypeSpec
155+
156+ assertThat(type.kind).isEqualTo(TypeSpec .Kind .INTERFACE )
157+ assertThat(type.funSpecs).hasSize(1 )
158+ val fn = type.funSpecs.single()
159+ assertThat(fn.name).isEqualTo(" getPerson" )
160+ assertThat((fn.returnType as ClassName ).canonicalName).isEqualTo(" $typesPackageName .Person" )
161+ assertThat(fn.parameters).hasSize(2 )
162+ val arg0 = fn.parameters[0 ]
163+ assertThat(arg0.name).isEqualTo(" name" )
164+ assertThat((arg0.type as ClassName ).canonicalName).isEqualTo(String ::class .qualifiedName)
165+ assertThat(arg0.annotations).hasSize(1 )
166+ val arg0Annotation = arg0.annotations[0 ]
167+ assertThat(arg0Annotation.typeName.toString()).isEqualTo(" com.netflix.graphql.dgs.InputArgument" )
168+ assertThat(arg0Annotation.members.single().toString()).isEqualTo(" \" name\" " )
169+ val arg1 = fn.parameters[1 ]
170+ assertThat(arg1.name).isEqualTo(" dataFetchingEnvironment" )
171+ assertThat((arg1.type as ClassName ).canonicalName).isEqualTo(DataFetchingEnvironment ::class .qualifiedName)
172+ }
173+
71174 @Test
72175 fun generateDataClassWithNullablePrimitive () {
73176 val schema = """
0 commit comments