Skip to content

Commit 02cd272

Browse files
committed
Fix generation of Interface when return type of the method has a list of Unions #1018
1 parent ec6d30d commit 02cd272

File tree

15 files changed

+125
-37
lines changed

15 files changed

+125
-37
lines changed

src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLTypeMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public NamedDefinition getLanguageType(MappingContext mappingContext, String gra
101101
serializeUsingObjectMapper = true;
102102
}
103103

104-
return new NamedDefinition(langTypeName, graphQLType, mappingContext.getInterfacesName().contains(graphQLType),
104+
return new NamedDefinition(langTypeName, graphQLType, isInterfaceOrUnion(mappingContext, graphQLType),
105105
mandatory, primitiveCanBeUsed, serializeUsingObjectMapper);
106106
}
107107

src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphQLTypeMapper.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,8 @@ public NamedDefinition getLanguageType(MappingContext mappingContext, Type<?> gr
177177
} else if (graphqlType instanceof ListType) {
178178
NamedDefinition mappedCollectionType = getLanguageType(mappingContext, ((ListType) graphqlType).getType(),
179179
name, parentTypeName, false, true);
180-
if (mappedCollectionType.isInterface() && mappingContext.getInterfacesName().contains(parentTypeName)) {
180+
if (mappedCollectionType.isInterfaceOrUnion() &&
181+
isInterfaceOrUnion(mappingContext, parentTypeName)) {
181182
mappedCollectionType.setJavaName(
182183
wrapSuperTypeIntoList(mappingContext, mappedCollectionType.getJavaName(), mandatory));
183184
} else {
@@ -223,7 +224,7 @@ public NamedDefinition getLanguageType(MappingContext mappingContext, String gra
223224
serializeFieldsUsingObjectMapper.contains(graphQLType) ||
224225
serializeFieldsUsingObjectMapper.contains(parentTypeName + "." + name);
225226

226-
return new NamedDefinition(langTypeName, graphQLType, mappingContext.getInterfacesName().contains(graphQLType),
227+
return new NamedDefinition(langTypeName, graphQLType, isInterfaceOrUnion(mappingContext, graphQLType),
227228
mandatory, primitiveCanBeUsed, serializeUsingObjectMapper);
228229
}
229230

@@ -247,4 +248,9 @@ public String getResponseReturnType(MappingContext mappingContext,
247248
return computedTypeName;
248249
}
249250

251+
protected boolean isInterfaceOrUnion(MappingContext mappingContext, String graphQLType) {
252+
return mappingContext.getInterfacesName().contains(graphQLType) ||
253+
mappingContext.getUnionsNames().contains(graphQLType);
254+
}
255+
250256
}

src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public class MappingContext implements GraphQLCodegenConfiguration {
2929
private final ExtendedDocument document;
3030
private final Set<String> typesUnionsInterfacesNames;
3131
private final Set<String> interfacesName;
32+
private final Set<String> unionsName;
3233
private final Set<String> operationsName;
3334
private final Map<String, Set<String>> interfaceChildren;
3435
private final GeneratedInformation generatedInformation;
@@ -47,6 +48,7 @@ private MappingContext(File outputDirectory,
4748
this.document = document;
4849
this.typesUnionsInterfacesNames = document.getTypesUnionsInterfacesNames();
4950
this.interfacesName = document.getInterfacesNames();
51+
this.unionsName = document.getUnionsNames();
5052
this.interfaceChildren = document.getInterfaceChildren();
5153
this.generatedInformation = generatedInformation;
5254
this.operationsName = document.getOperationsNames();
@@ -346,6 +348,10 @@ public Set<String> getInterfacesName() {
346348
return interfacesName;
347349
}
348350

351+
public Set<String> getUnionsNames() {
352+
return unionsName;
353+
}
354+
349355
public Set<String> getOperationsName() {
350356
return operationsName;
351357
}

src/main/java/com/kobylynskyi/graphql/codegen/model/NamedDefinition.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@ public class NamedDefinition {
77

88
private String javaName;
99
private String graphqlTypeName;
10-
private boolean isInterface;
10+
private boolean isInterfaceOrUnion;
1111
private boolean mandatory;
1212
private boolean primitiveCanBeUsed;
1313
private boolean serializeUsingObjectMapper;
1414

1515
public NamedDefinition(String javaName, String graphqlTypeName,
16-
boolean isInterface, boolean mandatory,
16+
boolean isInterfaceOrUnion, boolean mandatory,
1717
boolean primitiveCanBeUsed, boolean serializeUsingObjectMapper) {
1818
this.javaName = javaName;
1919
this.graphqlTypeName = graphqlTypeName;
20-
this.isInterface = isInterface;
20+
this.isInterfaceOrUnion = isInterfaceOrUnion;
2121
this.mandatory = mandatory;
2222
this.primitiveCanBeUsed = primitiveCanBeUsed;
2323
this.serializeUsingObjectMapper = serializeUsingObjectMapper;
@@ -39,12 +39,12 @@ public void setGraphqlTypeName(String graphqlTypeName) {
3939
this.graphqlTypeName = graphqlTypeName;
4040
}
4141

42-
public boolean isInterface() {
43-
return isInterface;
42+
public boolean isInterfaceOrUnion() {
43+
return isInterfaceOrUnion;
4444
}
4545

46-
public void setInterface(boolean anInterface) {
47-
isInterface = anInterface;
46+
public void setInterfaceOrUnion(boolean interfaceOrUnion) {
47+
isInterfaceOrUnion = interfaceOrUnion;
4848
}
4949

5050
public boolean isMandatory() {

src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDocument.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ public Set<String> getInterfacesNames() {
8888
.collect(Collectors.toSet());
8989
}
9090

91+
public Set<String> getUnionsNames() {
92+
return unionDefinitions.stream()
93+
.map(ExtendedDefinition::getName)
94+
.collect(Collectors.toSet());
95+
}
96+
9197
public Set<String> getOperationsNames() {
9298
return operationDefinitions.stream()
9399
.map(ExtendedObjectTypeDefinition::getFieldDefinitions)

src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionResolverTest.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,6 @@ void init() {
3030
mappingConfig.setGenerateJacksonTypeIdResolver(true);
3131
}
3232

33-
private List<File> generate(String s) throws IOException {
34-
return new JavaGraphQLCodegen(singletonList(s), outputBuildDir, mappingConfig,
35-
TestUtils.getStaticGeneratedInfo()).generate();
36-
}
37-
3833
@AfterEach
3934
void cleanup() {
4035
Utils.deleteDir(outputBuildDir);
@@ -48,8 +43,8 @@ void generate_CheckFiles_with_model_package() throws Exception {
4843
File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/unionresolver");
4944
File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
5045
List<String> generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList());
51-
List<String> expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.java", "UnionMemberA.java",
52-
"UnionMemberB.java", "UnionToResolve.java");
46+
List<String> expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.java", "ResultObject.java",
47+
"UnionMemberA.java", "UnionMemberB.java", "UnionToResolve.java");
5348
assertEquals(expectedClasses, generatedFileNames);
5449

5550
for (File file : files) {
@@ -70,8 +65,8 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro
7065
File outputJavaClassesDir = new File("build/generated");
7166
File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
7267
List<String> generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList());
73-
List<String> expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.java", "MyUnionMemberASuffix.java",
74-
"MyUnionMemberBSuffix.java", "MyUnionToResolveSuffix.java");
68+
List<String> expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.java", "MyResultObjectSuffix.java",
69+
"MyUnionMemberASuffix.java", "MyUnionMemberBSuffix.java", "MyUnionToResolveSuffix.java");
7570
assertEquals(expectedClasses, generatedFileNames);
7671

7772
for (File file : files) {
@@ -82,4 +77,10 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro
8277
file);
8378
}
8479
}
80+
81+
private void generate(String path) throws IOException {
82+
new JavaGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig,
83+
TestUtils.getStaticGeneratedInfo()).generate();
84+
}
85+
8586
}

src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionResolverTest.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,6 @@ void init() {
3232
mappingConfig.setGeneratedLanguage(GeneratedLanguage.KOTLIN);
3333
}
3434

35-
private List<File> generate(String s) throws IOException {
36-
return new KotlinGraphQLCodegen(singletonList(s), outputBuildDir, mappingConfig,
37-
TestUtils.getStaticGeneratedInfo()).generate();
38-
}
39-
4035
@AfterEach
4136
void cleanup() {
4237
Utils.deleteDir(outputBuildDir);
@@ -50,8 +45,8 @@ void generate_CheckFiles_with_model_package() throws Exception {
5045
File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/unionresolver");
5146
File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
5247
List<String> generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList());
53-
List<String> expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.kt", "UnionMemberA.kt",
54-
"UnionMemberB.kt", "UnionToResolve.kt");
48+
List<String> expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.kt", "ResultObject.kt",
49+
"UnionMemberA.kt", "UnionMemberB.kt", "UnionToResolve.kt");
5550
assertEquals(expectedClasses, generatedFileNames);
5651

5752
for (File file : files) {
@@ -72,8 +67,8 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro
7267
File outputJavaClassesDir = new File("build/generated");
7368
File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
7469
List<String> generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList());
75-
List<String> expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.kt", "MyUnionMemberASuffix.kt",
76-
"MyUnionMemberBSuffix.kt", "MyUnionToResolveSuffix.kt");
70+
List<String> expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.kt", "MyResultObjectSuffix.kt",
71+
"MyUnionMemberASuffix.kt", "MyUnionMemberBSuffix.kt", "MyUnionToResolveSuffix.kt");
7772
assertEquals(expectedClasses, generatedFileNames);
7873

7974
for (File file : files) {
@@ -85,4 +80,10 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro
8580
file);
8681
}
8782
}
83+
84+
private void generate(String path) throws IOException {
85+
new KotlinGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig,
86+
TestUtils.getStaticGeneratedInfo()).generate();
87+
}
88+
8889
}

src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenUnionResolverTest.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,6 @@ void init() {
3232
mappingConfig.setGeneratedLanguage(GeneratedLanguage.SCALA);
3333
}
3434

35-
private List<File> generate(String s) throws IOException {
36-
return new ScalaGraphQLCodegen(singletonList(s), outputBuildDir, mappingConfig,
37-
TestUtils.getStaticGeneratedInfo()).generate();
38-
}
39-
4035
@AfterEach
4136
void cleanup() {
4237
Utils.deleteDir(outputBuildDir);
@@ -50,8 +45,8 @@ void generate_CheckFiles_with_model_package() throws Exception {
5045
File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/unionresolver");
5146
File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
5247
List<String> generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList());
53-
List<String> expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.scala", "UnionMemberA.scala",
54-
"UnionMemberB.scala", "UnionToResolve.scala");
48+
List<String> expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.scala", "ResultObject.scala",
49+
"UnionMemberA.scala", "UnionMemberB.scala", "UnionToResolve.scala");
5550
assertEquals(expectedClasses, generatedFileNames);
5651

5752
for (File file : files) {
@@ -72,8 +67,8 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro
7267
File outputJavaClassesDir = new File("build/generated");
7368
File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
7469
List<String> generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList());
75-
List<String> expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.scala", "MyUnionMemberASuffix.scala",
76-
"MyUnionMemberBSuffix.scala", "MyUnionToResolveSuffix.scala");
70+
List<String> expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.scala", "MyResultObjectSuffix.scala",
71+
"MyUnionMemberASuffix.scala", "MyUnionMemberBSuffix.scala", "MyUnionToResolveSuffix.scala");
7772
assertEquals(expectedClasses, generatedFileNames);
7873

7974
for (File file : files) {
@@ -85,4 +80,10 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro
8580
file);
8681
}
8782
}
83+
84+
private void generate(String path) throws IOException {
85+
new ScalaGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig,
86+
TestUtils.getStaticGeneratedInfo()).generate();
87+
}
88+
8889
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.kobylynskyi.graphql.unionresolver;
2+
3+
4+
@javax.annotation.Generated(
5+
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
6+
date = "2020-12-31T23:59:59-0500"
7+
)
8+
public interface ResultObject {
9+
10+
java.util.List<? extends UnionToResolve> getList();
11+
12+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
@javax.annotation.Generated(
2+
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
3+
date = "2020-12-31T23:59:59-0500"
4+
)
5+
public interface MyResultObjectSuffix {
6+
7+
java.util.List<? extends MyUnionToResolveSuffix> getList();
8+
9+
}

0 commit comments

Comments
 (0)