From 99610a7e9694d641704ce8a55bfe9bec99c0de8e Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Tue, 8 Feb 2022 21:58:24 -0500 Subject: [PATCH] Do not put validation annotaiton if return type is a nullable list having non-null values #959 --- .../codegen/mapper/AnnotationsMapper.java | 16 ++++- .../GraphQLCodegenAnnotationsTest.java | 16 +++++ .../expected-classes/CommitResolver.java.txt | 2 +- .../expected-classes/ProfileOwner.java.txt | 4 +- ...ithMandatoryElementsQueryResolver.java.txt | 18 ++++++ .../TypeWithNullableListType.java.txt | 61 +++++++++++++++++++ .../deprecated/EventsQueryResolver.java.txt | 1 - .../deprecated/QueryResolver.java.txt | 1 - .../AssetsQueryResolver.java.txt | 1 - .../extend-with-resolvers/EventInput.java.txt | 1 - .../EventResolver.java.txt | 1 - .../EventsQueryResolver.java.txt | 1 - .../QueryResolver.java.txt | 2 - .../extend/AssetsQueryResolver.java.txt | 1 - .../expected-classes/extend/Event.java.txt | 1 - .../extend/EventInput.java.txt | 1 - .../extend/EventsQueryResolver.java.txt | 1 - .../extend/QueryResolver.java.txt | 2 - .../optional/QueryResolver.java.txt | 4 +- .../deprecated/EventsQueryResolver.scala.txt | 1 - .../scala/deprecated/QueryResolver.scala.txt | 1 - .../extend/AssetsQueryResolver.scala.txt | 1 - .../scala/extend/Event.scala.txt | 1 - .../scala/extend/EventInput.scala.txt | 1 - .../extend/EventsQueryResolver.scala.txt | 1 - .../scala/extend/QueryResolver.scala.txt | 2 - .../extend/nullable/QueryResolver.scala.txt | 1 - ...list-type-with-nullable-sub-types.graphqls | 13 ++++ 28 files changed, 127 insertions(+), 30 deletions(-) create mode 100644 src/test/resources/expected-classes/annotation/NullableListReturnTypeWithMandatoryElementsQueryResolver.java.txt create mode 100644 src/test/resources/expected-classes/annotation/TypeWithNullableListType.java.txt create mode 100644 src/test/resources/schemas/nullable-list-type-with-nullable-sub-types.graphqls diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/AnnotationsMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/AnnotationsMapper.java index 85f1430d5..5a23d5ce6 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/AnnotationsMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/AnnotationsMapper.java @@ -6,6 +6,7 @@ import com.kobylynskyi.graphql.codegen.utils.Utils; import graphql.language.Argument; import graphql.language.Directive; +import graphql.language.InputValueDefinition; import graphql.language.ListType; import graphql.language.NamedNode; import graphql.language.NonNullType; @@ -39,9 +40,20 @@ public abstract class AnnotationsMapper { public List getAnnotations(MappingContext mappingContext, Type type, NamedNode def, String parentTypeName, boolean mandatory) { if (type instanceof ListType) { - return getAnnotations(mappingContext, ((ListType) type).getType(), def, parentTypeName, mandatory); + Type subType = ((ListType) type).getType(); + return getAnnotations(mappingContext, subType, def, parentTypeName, mandatory); } else if (type instanceof NonNullType) { - return getAnnotations(mappingContext, ((NonNullType) type).getType(), def, parentTypeName, true); + Type parentType = null; + if (def instanceof ExtendedFieldDefinition) { + parentType = ((ExtendedFieldDefinition) def).getType(); + } else if (def instanceof InputValueDefinition) { + parentType = ((InputValueDefinition) def).getType(); + } + // if parent is a list, then pass a mandatory flag as is (do not override it) + if (!(parentType instanceof ListType)) { + mandatory = true; + } + return getAnnotations(mappingContext, ((NonNullType) type).getType(), def, parentTypeName, mandatory); } else if (type instanceof TypeName) { return getAnnotations(mappingContext, ((TypeName) type).getName(), def.getName(), parentTypeName, getDirectives(def), mandatory, def); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java index 3ef9c66af..bfd231fdf 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java @@ -266,4 +266,20 @@ void generate_Directives() throws Exception { getFileByName(files, "User.java")); } + @Test + void generate_ModelValidationAnnotationForSubType() throws Exception { + new JavaGraphQLCodegen(singletonList( + "src/test/resources/schemas/nullable-list-type-with-nullable-sub-types.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/annotation/" + + "NullableListReturnTypeWithMandatoryElementsQueryResolver.java.txt"), + getFileByName(files, "NullableListReturnTypeWithMandatoryElementsQueryResolver.java")); + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/annotation/TypeWithNullableListType.java.txt"), + getFileByName(files, "TypeWithNullableListType.java")); + } + } diff --git a/src/test/resources/expected-classes/CommitResolver.java.txt b/src/test/resources/expected-classes/CommitResolver.java.txt index 56e7e97b8..175457624 100644 --- a/src/test/resources/expected-classes/CommitResolver.java.txt +++ b/src/test/resources/expected-classes/CommitResolver.java.txt @@ -19,7 +19,7 @@ public interface CommitResolver { @javax.validation.constraints.NotNull CommitCommentConnection comments(Commit commit, String after, String before, Integer first, Integer last, graphql.schema.DataFetchingEnvironment env) throws Exception; - DeploymentConnection deployments(Commit commit, String after, String before, @javax.validation.constraints.NotNull java.util.List environments, Integer first, Integer last, DeploymentOrder orderBy, graphql.schema.DataFetchingEnvironment env) throws Exception; + DeploymentConnection deployments(Commit commit, String after, String before, java.util.List environments, Integer first, Integer last, DeploymentOrder orderBy, graphql.schema.DataFetchingEnvironment env) throws Exception; @javax.validation.constraints.NotNull CommitHistoryConnection history(Commit commit, String after, CommitAuthor author, String before, Integer first, Integer last, String path, String since, String until, graphql.schema.DataFetchingEnvironment env) throws Exception; diff --git a/src/test/resources/expected-classes/ProfileOwner.java.txt b/src/test/resources/expected-classes/ProfileOwner.java.txt index 0cb9bf1d6..caf8156d3 100644 --- a/src/test/resources/expected-classes/ProfileOwner.java.txt +++ b/src/test/resources/expected-classes/ProfileOwner.java.txt @@ -25,10 +25,10 @@ public interface ProfileOwner { String getName(); @javax.validation.constraints.NotNull - PinnableItemConnection getPinnableItems(String after, String before, Integer first, Integer last, @javax.validation.constraints.NotNull java.util.List types); + PinnableItemConnection getPinnableItems(String after, String before, Integer first, Integer last, java.util.List types); @javax.validation.constraints.NotNull - PinnableItemConnection getPinnedItems(String after, String before, Integer first, Integer last, @javax.validation.constraints.NotNull java.util.List types); + PinnableItemConnection getPinnedItems(String after, String before, Integer first, Integer last, java.util.List types); int getPinnedItemsRemaining(); diff --git a/src/test/resources/expected-classes/annotation/NullableListReturnTypeWithMandatoryElementsQueryResolver.java.txt b/src/test/resources/expected-classes/annotation/NullableListReturnTypeWithMandatoryElementsQueryResolver.java.txt new file mode 100644 index 000000000..f777daccc --- /dev/null +++ b/src/test/resources/expected-classes/annotation/NullableListReturnTypeWithMandatoryElementsQueryResolver.java.txt @@ -0,0 +1,18 @@ +package com.kobylynskyi.graphql.test1; + + +/** + * NonNull validation annotation should not be present here + */ +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public interface NullableListReturnTypeWithMandatoryElementsQueryResolver { + + /** + * NonNull validation annotation should not be present here + */ + java.util.List nullableListReturnTypeWithMandatoryElements() throws Exception; + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/annotation/TypeWithNullableListType.java.txt b/src/test/resources/expected-classes/annotation/TypeWithNullableListType.java.txt new file mode 100644 index 000000000..05a57661a --- /dev/null +++ b/src/test/resources/expected-classes/annotation/TypeWithNullableListType.java.txt @@ -0,0 +1,61 @@ +package com.kobylynskyi.graphql.test1; + + +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public class TypeWithNullableListType implements java.io.Serializable { + + private static final long serialVersionUID = 1L; + + private java.util.List nullableListFieldWithMandatoryElements; + + public TypeWithNullableListType() { + } + + public TypeWithNullableListType(java.util.List nullableListFieldWithMandatoryElements) { + this.nullableListFieldWithMandatoryElements = nullableListFieldWithMandatoryElements; + } + + /** + * NonNull validation annotation should not be present here + */ + public java.util.List getNullableListFieldWithMandatoryElements() { + return nullableListFieldWithMandatoryElements; + } + /** + * NonNull validation annotation should not be present here + */ + public void setNullableListFieldWithMandatoryElements(java.util.List nullableListFieldWithMandatoryElements) { + this.nullableListFieldWithMandatoryElements = nullableListFieldWithMandatoryElements; + } + + + + public static TypeWithNullableListType.Builder builder() { + return new TypeWithNullableListType.Builder(); + } + + public static class Builder { + + private java.util.List nullableListFieldWithMandatoryElements; + + public Builder() { + } + + /** + * NonNull validation annotation should not be present here + */ + public Builder setNullableListFieldWithMandatoryElements(java.util.List nullableListFieldWithMandatoryElements) { + this.nullableListFieldWithMandatoryElements = nullableListFieldWithMandatoryElements; + return this; + } + + + public TypeWithNullableListType build() { + return new TypeWithNullableListType(nullableListFieldWithMandatoryElements); + } + + } +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/deprecated/EventsQueryResolver.java.txt b/src/test/resources/expected-classes/deprecated/EventsQueryResolver.java.txt index 6bf51df67..d6cec8971 100644 --- a/src/test/resources/expected-classes/deprecated/EventsQueryResolver.java.txt +++ b/src/test/resources/expected-classes/deprecated/EventsQueryResolver.java.txt @@ -8,7 +8,6 @@ package com.kobylynskyi.graphql.test1; public interface EventsQueryResolver { @Deprecated - @javax.validation.constraints.NotNull java.util.List events() throws Exception; } \ No newline at end of file diff --git a/src/test/resources/expected-classes/deprecated/QueryResolver.java.txt b/src/test/resources/expected-classes/deprecated/QueryResolver.java.txt index 781a6685e..de0cef0bd 100644 --- a/src/test/resources/expected-classes/deprecated/QueryResolver.java.txt +++ b/src/test/resources/expected-classes/deprecated/QueryResolver.java.txt @@ -8,7 +8,6 @@ package com.kobylynskyi.graphql.test1; public interface QueryResolver { @Deprecated - @javax.validation.constraints.NotNull java.util.List events() throws Exception; } \ No newline at end of file diff --git a/src/test/resources/expected-classes/extend-with-resolvers/AssetsQueryResolver.java.txt b/src/test/resources/expected-classes/extend-with-resolvers/AssetsQueryResolver.java.txt index f771b0022..2b56e4e92 100644 --- a/src/test/resources/expected-classes/extend-with-resolvers/AssetsQueryResolver.java.txt +++ b/src/test/resources/expected-classes/extend-with-resolvers/AssetsQueryResolver.java.txt @@ -4,7 +4,6 @@ ) public interface AssetsQueryResolver { - @javax.validation.constraints.NotNull java.util.List assets() throws Exception; } \ No newline at end of file diff --git a/src/test/resources/expected-classes/extend-with-resolvers/EventInput.java.txt b/src/test/resources/expected-classes/extend-with-resolvers/EventInput.java.txt index 56b4d5269..5aaae877b 100644 --- a/src/test/resources/expected-classes/extend-with-resolvers/EventInput.java.txt +++ b/src/test/resources/expected-classes/extend-with-resolvers/EventInput.java.txt @@ -8,7 +8,6 @@ public class EventInput implements java.io.Serializable { @javax.validation.constraints.NotNull private Status status; - @javax.validation.constraints.NotNull private java.util.List assets; public EventInput() { diff --git a/src/test/resources/expected-classes/extend-with-resolvers/EventResolver.java.txt b/src/test/resources/expected-classes/extend-with-resolvers/EventResolver.java.txt index cdcab313f..c828b3654 100644 --- a/src/test/resources/expected-classes/extend-with-resolvers/EventResolver.java.txt +++ b/src/test/resources/expected-classes/extend-with-resolvers/EventResolver.java.txt @@ -10,7 +10,6 @@ public interface EventResolver { /** * Optional list of assets */ - @javax.validation.constraints.NotNull java.util.List assets(Event event) throws Exception; } \ No newline at end of file diff --git a/src/test/resources/expected-classes/extend-with-resolvers/EventsQueryResolver.java.txt b/src/test/resources/expected-classes/extend-with-resolvers/EventsQueryResolver.java.txt index b8f220371..3be49a6e1 100644 --- a/src/test/resources/expected-classes/extend-with-resolvers/EventsQueryResolver.java.txt +++ b/src/test/resources/expected-classes/extend-with-resolvers/EventsQueryResolver.java.txt @@ -4,7 +4,6 @@ ) public interface EventsQueryResolver { - @javax.validation.constraints.NotNull java.util.List events() throws Exception; } \ No newline at end of file diff --git a/src/test/resources/expected-classes/extend-with-resolvers/QueryResolver.java.txt b/src/test/resources/expected-classes/extend-with-resolvers/QueryResolver.java.txt index ed78acc3f..90d2bbff0 100644 --- a/src/test/resources/expected-classes/extend-with-resolvers/QueryResolver.java.txt +++ b/src/test/resources/expected-classes/extend-with-resolvers/QueryResolver.java.txt @@ -8,10 +8,8 @@ ) public interface QueryResolver { - @javax.validation.constraints.NotNull java.util.List events() throws Exception; - @javax.validation.constraints.NotNull java.util.List assets() throws Exception; } \ No newline at end of file diff --git a/src/test/resources/expected-classes/extend/AssetsQueryResolver.java.txt b/src/test/resources/expected-classes/extend/AssetsQueryResolver.java.txt index f771b0022..2b56e4e92 100644 --- a/src/test/resources/expected-classes/extend/AssetsQueryResolver.java.txt +++ b/src/test/resources/expected-classes/extend/AssetsQueryResolver.java.txt @@ -4,7 +4,6 @@ ) public interface AssetsQueryResolver { - @javax.validation.constraints.NotNull java.util.List assets() throws Exception; } \ No newline at end of file diff --git a/src/test/resources/expected-classes/extend/Event.java.txt b/src/test/resources/expected-classes/extend/Event.java.txt index fd440bd82..6dbb8ccdd 100644 --- a/src/test/resources/expected-classes/extend/Event.java.txt +++ b/src/test/resources/expected-classes/extend/Event.java.txt @@ -10,7 +10,6 @@ public class Event implements java.io.Serializable, PinnableItem, Node { private Status status; @javax.validation.constraints.NotNull private String createdDateTime; - @javax.validation.constraints.NotNull private java.util.List assets; @javax.validation.constraints.NotNull private String id; diff --git a/src/test/resources/expected-classes/extend/EventInput.java.txt b/src/test/resources/expected-classes/extend/EventInput.java.txt index 56b4d5269..5aaae877b 100644 --- a/src/test/resources/expected-classes/extend/EventInput.java.txt +++ b/src/test/resources/expected-classes/extend/EventInput.java.txt @@ -8,7 +8,6 @@ public class EventInput implements java.io.Serializable { @javax.validation.constraints.NotNull private Status status; - @javax.validation.constraints.NotNull private java.util.List assets; public EventInput() { diff --git a/src/test/resources/expected-classes/extend/EventsQueryResolver.java.txt b/src/test/resources/expected-classes/extend/EventsQueryResolver.java.txt index b8f220371..3be49a6e1 100644 --- a/src/test/resources/expected-classes/extend/EventsQueryResolver.java.txt +++ b/src/test/resources/expected-classes/extend/EventsQueryResolver.java.txt @@ -4,7 +4,6 @@ ) public interface EventsQueryResolver { - @javax.validation.constraints.NotNull java.util.List events() throws Exception; } \ No newline at end of file diff --git a/src/test/resources/expected-classes/extend/QueryResolver.java.txt b/src/test/resources/expected-classes/extend/QueryResolver.java.txt index ed78acc3f..90d2bbff0 100644 --- a/src/test/resources/expected-classes/extend/QueryResolver.java.txt +++ b/src/test/resources/expected-classes/extend/QueryResolver.java.txt @@ -8,10 +8,8 @@ ) public interface QueryResolver { - @javax.validation.constraints.NotNull java.util.List events() throws Exception; - @javax.validation.constraints.NotNull java.util.List assets() throws Exception; } \ No newline at end of file diff --git a/src/test/resources/expected-classes/optional/QueryResolver.java.txt b/src/test/resources/expected-classes/optional/QueryResolver.java.txt index c43ce5202..91c3603d5 100644 --- a/src/test/resources/expected-classes/optional/QueryResolver.java.txt +++ b/src/test/resources/expected-classes/optional/QueryResolver.java.txt @@ -14,7 +14,7 @@ public interface QueryResolver { java.util.List licenses() throws Exception; @javax.validation.constraints.NotNull - java.util.List marketplaceCategories(Boolean excludeEmpty, Boolean excludeSubcategories, @javax.validation.constraints.NotNull java.util.List includeCategories) throws Exception; + java.util.List marketplaceCategories(Boolean excludeEmpty, Boolean excludeSubcategories, java.util.List includeCategories) throws Exception; java.util.Optional marketplaceCategory(@javax.validation.constraints.NotNull String slug, Boolean useTopicAliases) throws Exception; @@ -53,7 +53,7 @@ public interface QueryResolver { java.util.Optional securityAdvisory(@javax.validation.constraints.NotNull String ghsaId) throws Exception; @javax.validation.constraints.NotNull - SecurityVulnerabilityConnection securityVulnerabilities(String after, String before, SecurityAdvisoryEcosystem ecosystem, Integer first, Integer last, SecurityVulnerabilityOrder orderBy, String Package, @javax.validation.constraints.NotNull java.util.List severities) throws Exception; + SecurityVulnerabilityConnection securityVulnerabilities(String after, String before, SecurityAdvisoryEcosystem ecosystem, Integer first, Integer last, SecurityVulnerabilityOrder orderBy, String Package, java.util.List severities) throws Exception; java.util.Optional sponsorsListing(@javax.validation.constraints.NotNull String slug) throws Exception; diff --git a/src/test/resources/expected-classes/scala/deprecated/EventsQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/deprecated/EventsQueryResolver.scala.txt index 1522cc395..b5979cd1e 100644 --- a/src/test/resources/expected-classes/scala/deprecated/EventsQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/deprecated/EventsQueryResolver.scala.txt @@ -8,7 +8,6 @@ package com.github.graphql trait EventsQueryResolver { @deprecated(message = "No longer supported") - @javax.validation.constraints.NotNull @throws[Exception] def events(): scala.Seq[Event] diff --git a/src/test/resources/expected-classes/scala/deprecated/QueryResolver.scala.txt b/src/test/resources/expected-classes/scala/deprecated/QueryResolver.scala.txt index a0aeb62c9..aee29c591 100644 --- a/src/test/resources/expected-classes/scala/deprecated/QueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/deprecated/QueryResolver.scala.txt @@ -8,7 +8,6 @@ package com.github.graphql trait QueryResolver { @deprecated(message = "No longer supported") - @javax.validation.constraints.NotNull @throws[Exception] def events(): scala.Seq[Event] diff --git a/src/test/resources/expected-classes/scala/extend/AssetsQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/AssetsQueryResolver.scala.txt index b424030e9..616167709 100644 --- a/src/test/resources/expected-classes/scala/extend/AssetsQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/AssetsQueryResolver.scala.txt @@ -5,7 +5,6 @@ ) trait AssetsQueryResolver { - @javax.validation.constraints.NotNull @throws[Exception] def assets(): scala.Seq[Asset] diff --git a/src/test/resources/expected-classes/scala/extend/Event.scala.txt b/src/test/resources/expected-classes/scala/extend/Event.scala.txt index 0e9e10a85..65a460330 100644 --- a/src/test/resources/expected-classes/scala/extend/Event.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/Event.scala.txt @@ -11,7 +11,6 @@ case class Event( status: Status, @javax.validation.constraints.NotNull createdDateTime: String, - @javax.validation.constraints.NotNull assets: scala.Seq[Asset], @javax.validation.constraints.NotNull override val id: String, diff --git a/src/test/resources/expected-classes/scala/extend/EventInput.scala.txt b/src/test/resources/expected-classes/scala/extend/EventInput.scala.txt index ec6d2ba5d..f1c66706a 100644 --- a/src/test/resources/expected-classes/scala/extend/EventInput.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/EventInput.scala.txt @@ -8,7 +8,6 @@ import Status._ case class EventInput( @javax.validation.constraints.NotNull status: Status, - @javax.validation.constraints.NotNull assets: scala.Seq[AssetInput] ) { diff --git a/src/test/resources/expected-classes/scala/extend/EventsQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/EventsQueryResolver.scala.txt index adf69d90b..9ec93f5d5 100644 --- a/src/test/resources/expected-classes/scala/extend/EventsQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/EventsQueryResolver.scala.txt @@ -5,7 +5,6 @@ ) trait EventsQueryResolver { - @javax.validation.constraints.NotNull @throws[Exception] def events(): scala.Seq[Event] diff --git a/src/test/resources/expected-classes/scala/extend/QueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/QueryResolver.scala.txt index 35a94c4ff..ad08adc7e 100644 --- a/src/test/resources/expected-classes/scala/extend/QueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/QueryResolver.scala.txt @@ -9,11 +9,9 @@ ) trait QueryResolver { - @javax.validation.constraints.NotNull @throws[Exception] def events(): scala.Seq[Event] - @javax.validation.constraints.NotNull @throws[Exception] def assets(): scala.Seq[Asset] diff --git a/src/test/resources/expected-classes/scala/extend/nullable/QueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/nullable/QueryResolver.scala.txt index df8ac926b..24095ddbd 100644 --- a/src/test/resources/expected-classes/scala/extend/nullable/QueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/nullable/QueryResolver.scala.txt @@ -5,7 +5,6 @@ ) trait QueryResolver { - @javax.validation.constraints.NotNull @throws[Exception] def events(): scala.Seq[Event] diff --git a/src/test/resources/schemas/nullable-list-type-with-nullable-sub-types.graphqls b/src/test/resources/schemas/nullable-list-type-with-nullable-sub-types.graphqls new file mode 100644 index 000000000..ecaea68c9 --- /dev/null +++ b/src/test/resources/schemas/nullable-list-type-with-nullable-sub-types.graphqls @@ -0,0 +1,13 @@ +type Query { + # NonNull validation annotation should not be present here + nullableListReturnTypeWithMandatoryElements: [TypeWithNullableListType!] +} + +type TypeWithNullableListType { + # NonNull validation annotation should not be present here + nullableListFieldWithMandatoryElements: [Type2!] +} + +type Type2 { + id: ID! +} \ No newline at end of file