From 9910eb80ba3d7753a40d4bdab1edb1af9113fb36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=A6=E5=A2=83=E8=BF=B7=E7=A6=BB?= <568845948@qq.com> Date: Thu, 4 Feb 2021 09:09:48 +0800 Subject: [PATCH] Add more Kotlin and Scala tests to cover field resolvers (#518) https://sonarcloud.io/component_measures?id=kobylynskyi_graphql-java-codegen&metric=new_coverage&selected=kobylynskyi_graphql-java-codegen%3Asrc%2Fmain%2Fjava%2Fcom%2Fkobylynskyi%2Fgraphql%2Fcodegen%2Fscala%2FScalaGraphQLTypeMapper.java&view=list --- .../kotlin/GraphQLCodegenGitHubTest.java | 18 +++++ .../kotlin/GraphQLCodegenRelayTest.java | 73 +++++++++++++++++++ .../scala/GraphQLCodegenRelayTest.java | 73 +++++++++++++++++++ ...cceptTopicSuggestionPayloadResolver.kt.txt | 16 ++++ ...ithubAcceptTopicSuggestionPayloadTO.kt.txt | 22 ++++++ .../kt/relay/Organization.kt.txt | 9 +++ .../relay/OrganizationsQueryResolver.kt.txt | 10 +++ .../kt/relay/QueryResolver.kt.txt | 13 ++++ .../expected-classes/kt/relay/User.kt.txt | 10 +++ .../kt/relay/UsersQueryResolver.kt.txt | 10 +++ .../relay/UsersQueryResolver_reactive.kt.txt | 10 +++ .../scala/relay/Organization.scala.txt | 12 +++ .../OrganizationsQueryResolver.scala.txt | 10 +++ .../scala/relay/QueryResolver.scala.txt | 13 ++++ .../scala/relay/User.scala.txt | 13 ++++ .../scala/relay/UsersQueryResolver.scala.txt | 10 +++ .../UsersQueryResolver_reactive.scala.txt | 10 +++ 17 files changed, 332 insertions(+) create mode 100644 src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRelayTest.java create mode 100644 src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRelayTest.java create mode 100644 src/test/resources/expected-classes/kt/field-resolver/AcceptTopicSuggestionPayloadResolver.kt.txt create mode 100644 src/test/resources/expected-classes/kt/field-resolver/GithubAcceptTopicSuggestionPayloadTO.kt.txt create mode 100644 src/test/resources/expected-classes/kt/relay/Organization.kt.txt create mode 100644 src/test/resources/expected-classes/kt/relay/OrganizationsQueryResolver.kt.txt create mode 100644 src/test/resources/expected-classes/kt/relay/QueryResolver.kt.txt create mode 100644 src/test/resources/expected-classes/kt/relay/User.kt.txt create mode 100644 src/test/resources/expected-classes/kt/relay/UsersQueryResolver.kt.txt create mode 100644 src/test/resources/expected-classes/kt/relay/UsersQueryResolver_reactive.kt.txt create mode 100644 src/test/resources/expected-classes/scala/relay/Organization.scala.txt create mode 100644 src/test/resources/expected-classes/scala/relay/OrganizationsQueryResolver.scala.txt create mode 100644 src/test/resources/expected-classes/scala/relay/QueryResolver.scala.txt create mode 100644 src/test/resources/expected-classes/scala/relay/User.scala.txt create mode 100644 src/test/resources/expected-classes/scala/relay/UsersQueryResolver.scala.txt create mode 100644 src/test/resources/expected-classes/scala/relay/UsersQueryResolver_reactive.scala.txt diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java index 1d26c98c..bdd30f04 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java @@ -11,6 +11,7 @@ import org.junit.jupiter.api.Test; import java.io.File; import java.io.IOException; +import java.util.Collections; import java.util.Objects; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; @@ -159,5 +160,22 @@ class GraphQLCodegenGitHubTest { getFileByName(files, "Commit.kt")); } + @Test + void generate_CustomFieldsResolvers() throws Exception { + mappingConfig.setModelNamePrefix("Github"); + mappingConfig.setModelNameSuffix("TO"); + mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(true); + mappingConfig.setFieldsWithResolvers(Collections.singleton("AcceptTopicSuggestionPayload.topic")); + + new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); + + assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/field-resolver/GithubAcceptTopicSuggestionPayloadTO.kt.txt"), + getFileByName(files, "GithubAcceptTopicSuggestionPayloadTO.kt")); + assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/field-resolver/AcceptTopicSuggestionPayloadResolver.kt.txt"), + getFileByName(files, "AcceptTopicSuggestionPayloadResolver.kt")); + } } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRelayTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRelayTest.java new file mode 100644 index 00000000..0cd75a2d --- /dev/null +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRelayTest.java @@ -0,0 +1,73 @@ +package com.kobylynskyi.graphql.codegen.kotlin; + +import com.kobylynskyi.graphql.codegen.TestUtils; +import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; +import com.kobylynskyi.graphql.codegen.model.MappingConfig; +import com.kobylynskyi.graphql.codegen.supplier.SchemaFinder; +import com.kobylynskyi.graphql.codegen.utils.Utils; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; +import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; +import static java.util.Arrays.asList; +import static java.util.stream.Collectors.toSet; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class GraphQLCodegenRelayTest { + + private final File outputBuildDir = new File("build/generated"); + private final File outputJavaClassesDir = new File("build/generated"); + private final MappingConfig mappingConfig = new MappingConfig(); + private final SchemaFinder schemaFinder = new SchemaFinder(Paths.get("src/test/resources")); + + @BeforeEach + void init() { + mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(true); + mappingConfig.setGeneratedLanguage(GeneratedLanguage.KOTLIN); + schemaFinder.setIncludePattern("relay.graphqls"); + } + + @AfterEach + void cleanup() { + Utils.deleteDir(outputBuildDir); + } + + @Test + void generateServerSideRelayClasses() throws Exception { + new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); + assertEquals(new HashSet<>(asList("Organization.kt", "User.kt", "OrganizationsQueryResolver.kt", + "QueryResolver.kt", "UsersQueryResolver.kt")), generatedFileNames); + + for (File file : files) { + assertSameTrimmedContent( + new File(String.format("src/test/resources/expected-classes/kt/relay/%s.txt", file.getName())), + file); + } + } + + @Test + void generateServerSideRelayClasses_CustomGenericsConnectionType() throws Exception { + mappingConfig.getRelayConfig() + .setConnectionType("reactor.core.publisher.Mono>"); + new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + + assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/relay/UsersQueryResolver_reactive.kt.txt"), + getFileByName(files, "UsersQueryResolver.kt")); + + } + +} \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRelayTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRelayTest.java new file mode 100644 index 00000000..57f97829 --- /dev/null +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRelayTest.java @@ -0,0 +1,73 @@ +package com.kobylynskyi.graphql.codegen.scala; + +import com.kobylynskyi.graphql.codegen.TestUtils; +import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; +import com.kobylynskyi.graphql.codegen.model.MappingConfig; +import com.kobylynskyi.graphql.codegen.supplier.SchemaFinder; +import com.kobylynskyi.graphql.codegen.utils.Utils; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; +import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; +import static java.util.Arrays.asList; +import static java.util.stream.Collectors.toSet; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class GraphQLCodegenRelayTest { + + private final File outputBuildDir = new File("build/generated"); + private final File outputJavaClassesDir = new File("build/generated"); + private final MappingConfig mappingConfig = new MappingConfig(); + private final SchemaFinder schemaFinder = new SchemaFinder(Paths.get("src/test/resources")); + + @BeforeEach + void init() { + mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(true); + mappingConfig.setGeneratedLanguage(GeneratedLanguage.SCALA); + schemaFinder.setIncludePattern("relay.graphqls"); + } + + @AfterEach + void cleanup() { + Utils.deleteDir(outputBuildDir); + } + + @Test + void generateServerSideRelayClasses() throws Exception { + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); + assertEquals(new HashSet<>(asList("Organization.scala", "User.scala", "OrganizationsQueryResolver.scala", + "QueryResolver.scala", "UsersQueryResolver.scala")), generatedFileNames); + + for (File file : files) { + assertSameTrimmedContent( + new File(String.format("src/test/resources/expected-classes/scala/relay/%s.txt", file.getName())), + file); + } + } + + @Test + void generateServerSideRelayClasses_CustomGenericsConnectionType() throws Exception { + mappingConfig.getRelayConfig() + .setConnectionType("reactor.core.publisher.Mono[graphql.relay.Connection[%s]]"); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + + assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/relay/UsersQueryResolver_reactive.scala.txt"), + getFileByName(files, "UsersQueryResolver.scala")); + + } + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/field-resolver/AcceptTopicSuggestionPayloadResolver.kt.txt b/src/test/resources/expected-classes/kt/field-resolver/AcceptTopicSuggestionPayloadResolver.kt.txt new file mode 100644 index 00000000..0ee7a15e --- /dev/null +++ b/src/test/resources/expected-classes/kt/field-resolver/AcceptTopicSuggestionPayloadResolver.kt.txt @@ -0,0 +1,16 @@ +package com.github.graphql + + +/** + * Resolver for AcceptTopicSuggestionPayload + */ +@javax.annotation.Generated( + value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], + date = "2020-12-31T23:59:59-0500" +) +interface AcceptTopicSuggestionPayloadResolver { + + @Throws(Exception::class) + fun topic(githubAcceptTopicSuggestionPayloadTO: GithubAcceptTopicSuggestionPayloadTO, env: graphql.schema.DataFetchingEnvironment): GithubTopicTO? + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/field-resolver/GithubAcceptTopicSuggestionPayloadTO.kt.txt b/src/test/resources/expected-classes/kt/field-resolver/GithubAcceptTopicSuggestionPayloadTO.kt.txt new file mode 100644 index 00000000..c5b8eaad --- /dev/null +++ b/src/test/resources/expected-classes/kt/field-resolver/GithubAcceptTopicSuggestionPayloadTO.kt.txt @@ -0,0 +1,22 @@ +package com.github.graphql + +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequestSerializer +import java.util.StringJoiner + +@javax.annotation.Generated( + value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], + date = "2020-12-31T23:59:59-0500" +) +data class GithubAcceptTopicSuggestionPayloadTO( + val clientMutationId: String? +) { + + // In the future, it maybe change. + override fun toString(): String { + val joiner = StringJoiner(", ", "{ ", " }") + if (clientMutationId != null) { + joiner.add("clientMutationId: " + GraphQLRequestSerializer.getEntry(clientMutationId)) + } + return joiner.toString() + } +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/relay/Organization.kt.txt b/src/test/resources/expected-classes/kt/relay/Organization.kt.txt new file mode 100644 index 00000000..0f01b7ec --- /dev/null +++ b/src/test/resources/expected-classes/kt/relay/Organization.kt.txt @@ -0,0 +1,9 @@ +@javax.annotation.Generated( + value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], + date = "2020-12-31T23:59:59-0500" +) +data class Organization( + val id: String +) { + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/relay/OrganizationsQueryResolver.kt.txt b/src/test/resources/expected-classes/kt/relay/OrganizationsQueryResolver.kt.txt new file mode 100644 index 00000000..ae65d3e0 --- /dev/null +++ b/src/test/resources/expected-classes/kt/relay/OrganizationsQueryResolver.kt.txt @@ -0,0 +1,10 @@ +@javax.annotation.Generated( + value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], + date = "2020-12-31T23:59:59-0500" +) +interface OrganizationsQueryResolver { + + @Throws(Exception::class) + fun organizations(first: Int?, after: String?, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/relay/QueryResolver.kt.txt b/src/test/resources/expected-classes/kt/relay/QueryResolver.kt.txt new file mode 100644 index 00000000..759c9379 --- /dev/null +++ b/src/test/resources/expected-classes/kt/relay/QueryResolver.kt.txt @@ -0,0 +1,13 @@ +@javax.annotation.Generated( + value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], + date = "2020-12-31T23:59:59-0500" +) +interface QueryResolver { + + @Throws(Exception::class) + fun users(first: Int, after: String?, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection + + @Throws(Exception::class) + fun organizations(first: Int?, after: String?, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/relay/User.kt.txt b/src/test/resources/expected-classes/kt/relay/User.kt.txt new file mode 100644 index 00000000..8b4169ab --- /dev/null +++ b/src/test/resources/expected-classes/kt/relay/User.kt.txt @@ -0,0 +1,10 @@ +@javax.annotation.Generated( + value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], + date = "2020-12-31T23:59:59-0500" +) +data class User( + val id: String, + val name: String? +) { + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/relay/UsersQueryResolver.kt.txt b/src/test/resources/expected-classes/kt/relay/UsersQueryResolver.kt.txt new file mode 100644 index 00000000..f59903b6 --- /dev/null +++ b/src/test/resources/expected-classes/kt/relay/UsersQueryResolver.kt.txt @@ -0,0 +1,10 @@ +@javax.annotation.Generated( + value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], + date = "2020-12-31T23:59:59-0500" +) +interface UsersQueryResolver { + + @Throws(Exception::class) + fun users(first: Int, after: String?, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/relay/UsersQueryResolver_reactive.kt.txt b/src/test/resources/expected-classes/kt/relay/UsersQueryResolver_reactive.kt.txt new file mode 100644 index 00000000..7eeadc72 --- /dev/null +++ b/src/test/resources/expected-classes/kt/relay/UsersQueryResolver_reactive.kt.txt @@ -0,0 +1,10 @@ +@javax.annotation.Generated( + value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], + date = "2020-12-31T23:59:59-0500" +) +interface UsersQueryResolver { + + @Throws(Exception::class) + fun users(first: Int, after: String?, env: graphql.schema.DataFetchingEnvironment): reactor.core.publisher.Mono> + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/relay/Organization.scala.txt b/src/test/resources/expected-classes/scala/relay/Organization.scala.txt new file mode 100644 index 00000000..bf8d156d --- /dev/null +++ b/src/test/resources/expected-classes/scala/relay/Organization.scala.txt @@ -0,0 +1,12 @@ +import scala.collection.JavaConverters._ + +@javax.annotation.Generated( + value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), + date = "2020-12-31T23:59:59-0500" +) +case class Organization( + @javax.validation.constraints.NotNull + id: String +) { + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/relay/OrganizationsQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/relay/OrganizationsQueryResolver.scala.txt new file mode 100644 index 00000000..597eaadc --- /dev/null +++ b/src/test/resources/expected-classes/scala/relay/OrganizationsQueryResolver.scala.txt @@ -0,0 +1,10 @@ +@javax.annotation.Generated( + value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), + date = "2020-12-31T23:59:59-0500" +) +trait OrganizationsQueryResolver { + + @throws[Exception] + def organizations(first: Option[Int], after: String, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection[Organization] + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/relay/QueryResolver.scala.txt b/src/test/resources/expected-classes/scala/relay/QueryResolver.scala.txt new file mode 100644 index 00000000..ffa9a9fb --- /dev/null +++ b/src/test/resources/expected-classes/scala/relay/QueryResolver.scala.txt @@ -0,0 +1,13 @@ +@javax.annotation.Generated( + value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), + date = "2020-12-31T23:59:59-0500" +) +trait QueryResolver { + + @throws[Exception] + def users(first: Int, after: String, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection[User] + + @throws[Exception] + def organizations(first: Option[Int], after: String, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection[Organization] + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/relay/User.scala.txt b/src/test/resources/expected-classes/scala/relay/User.scala.txt new file mode 100644 index 00000000..7da809ee --- /dev/null +++ b/src/test/resources/expected-classes/scala/relay/User.scala.txt @@ -0,0 +1,13 @@ +import scala.collection.JavaConverters._ + +@javax.annotation.Generated( + value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), + date = "2020-12-31T23:59:59-0500" +) +case class User( + @javax.validation.constraints.NotNull + id: String, + name: String +) { + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/relay/UsersQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/relay/UsersQueryResolver.scala.txt new file mode 100644 index 00000000..0949142e --- /dev/null +++ b/src/test/resources/expected-classes/scala/relay/UsersQueryResolver.scala.txt @@ -0,0 +1,10 @@ +@javax.annotation.Generated( + value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), + date = "2020-12-31T23:59:59-0500" +) +trait UsersQueryResolver { + + @throws[Exception] + def users(first: Int, after: String, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection[User] + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/relay/UsersQueryResolver_reactive.scala.txt b/src/test/resources/expected-classes/scala/relay/UsersQueryResolver_reactive.scala.txt new file mode 100644 index 00000000..619e69bd --- /dev/null +++ b/src/test/resources/expected-classes/scala/relay/UsersQueryResolver_reactive.scala.txt @@ -0,0 +1,10 @@ +@javax.annotation.Generated( + value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), + date = "2020-12-31T23:59:59-0500" +) +trait UsersQueryResolver { + + @throws[Exception] + def users(first: Int, after: String, env: graphql.schema.DataFetchingEnvironment): reactor.core.publisher.Mono[graphql.relay.Connection[User]] + +} \ No newline at end of file -- GitLab