From ce89ff19d392939a0139b369a3f14e1837dcfd83 Mon Sep 17 00:00:00 2001 From: Roman Lovakov Date: Fri, 27 Sep 2024 14:12:30 +0300 Subject: [PATCH 1/2] Add federation Resolver annotation to index --- .../smallrye/graphql/deployment/SmallRyeGraphQLProcessor.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLProcessor.java b/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLProcessor.java index df0fe33f6cadf..1ff5438078a37 100644 --- a/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLProcessor.java +++ b/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLProcessor.java @@ -94,6 +94,7 @@ import io.smallrye.graphql.api.federation.Key; import io.smallrye.graphql.api.federation.Provides; import io.smallrye.graphql.api.federation.Requires; +import io.smallrye.graphql.api.federation.Resolver; import io.smallrye.graphql.api.federation.Shareable; import io.smallrye.graphql.api.federation.Tag; import io.smallrye.graphql.api.federation.link.Import; @@ -321,6 +322,7 @@ void buildFinalIndex( indexer.indexClass(ScopeGroup.class); indexer.indexClass(ScopeItem.class); indexer.indexClass(Namespace.class); + indexer.indexClass(Resolver.class); } catch (IOException ex) { LOG.warn("Failure while creating index", ex); } From 607f8ed62f6314592998bf3c8aec9bdd185d5b07 Mon Sep 17 00:00:00 2001 From: Roman Lovakov Date: Fri, 27 Sep 2024 15:30:24 +0300 Subject: [PATCH 2/2] Add tests for resolvers --- .../federation/resolver/ExtendedApi.java | 25 ++++++ .../federation/resolver/ExtendedType.java | 65 ++++++++++++++++ .../resolver/FederationResolverTest.java | 77 +++++++++++++++++++ 3 files changed, 167 insertions(+) create mode 100644 extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/federation/resolver/ExtendedApi.java create mode 100644 extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/federation/resolver/ExtendedType.java create mode 100644 extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/federation/resolver/FederationResolverTest.java diff --git a/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/federation/resolver/ExtendedApi.java b/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/federation/resolver/ExtendedApi.java new file mode 100644 index 0000000000000..e33ecb3b5b1c7 --- /dev/null +++ b/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/federation/resolver/ExtendedApi.java @@ -0,0 +1,25 @@ +package io.quarkus.smallrye.graphql.deployment.federation.resolver; + +import org.eclipse.microprofile.graphql.GraphQLApi; + +import io.smallrye.graphql.api.federation.Resolver; + +@GraphQLApi +public class ExtendedApi { + @Resolver + public ExtendedType extendedTypeById(String id) { + ExtendedType extendedType = new ExtendedType(); + extendedType.setId(id); + extendedType.setDescription("extendedTypeById"); + return extendedType; + } + + @Resolver + public ExtendedType extendedTypeByIdNameKey(String id, String name, String key) { + ExtendedType extendedType = new ExtendedType(); + extendedType.setId(id); + extendedType.setValue(id + name + key); + extendedType.setDescription("extendedTypeByIdNameKey"); + return extendedType; + } +} diff --git a/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/federation/resolver/ExtendedType.java b/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/federation/resolver/ExtendedType.java new file mode 100644 index 0000000000000..2245792651af5 --- /dev/null +++ b/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/federation/resolver/ExtendedType.java @@ -0,0 +1,65 @@ +package io.quarkus.smallrye.graphql.deployment.federation.resolver; + +import io.smallrye.graphql.api.federation.Extends; +import io.smallrye.graphql.api.federation.External; +import io.smallrye.graphql.api.federation.FieldSet; +import io.smallrye.graphql.api.federation.Key; +import io.smallrye.graphql.api.federation.Requires; + +@Extends +@Key(fields = @FieldSet("id")) +public class ExtendedType { + @External + private String id; + + @External + private String name; + + @External + private String key; + + @Requires(fields = @FieldSet("name key")) + private String value; + + private String description; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/federation/resolver/FederationResolverTest.java b/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/federation/resolver/FederationResolverTest.java new file mode 100644 index 0000000000000..748aecf66c352 --- /dev/null +++ b/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/federation/resolver/FederationResolverTest.java @@ -0,0 +1,77 @@ +package io.quarkus.smallrye.graphql.deployment.federation.resolver; + +import org.hamcrest.CoreMatchers; +import org.jboss.shrinkwrap.api.asset.EmptyAsset; +import org.jboss.shrinkwrap.api.asset.StringAsset; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.smallrye.graphql.deployment.AbstractGraphQLTest; +import io.quarkus.test.QuarkusUnitTest; +import io.restassured.RestAssured; + +public class FederationResolverTest extends AbstractGraphQLTest { + + @RegisterExtension + static QuarkusUnitTest test = new QuarkusUnitTest() + .withApplicationRoot((jar) -> jar + .addClasses(ExtendedApi.class, ExtendedType.class) + .addAsResource(new StringAsset("quarkus.smallrye-graphql.schema-include-directives=true"), + "application.properties") + .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml")); + + @Test + public void resolverById() { + String request = getPayload(TEST_ID_QUERY); + RestAssured.given().when() + .accept(MEDIATYPE_JSON) + .contentType(MEDIATYPE_JSON) + .body(request) + .post("/graphql") + .then() + .assertThat() + .statusCode(200) + .and() + .body(CoreMatchers.is( + "{\"data\":{\"_entities\":[{\"id\":\"id\",\"description\":\"extendedTypeById\"}]}}")); + } + + @Test + public void resolverByIdNameKey() { + String request = getPayload(TEST_ID_NAME_KEY_QUERY); + RestAssured.given().when() + .accept(MEDIATYPE_JSON) + .contentType(MEDIATYPE_JSON) + .body(request) + .post("/graphql") + .then() + .assertThat() + .statusCode(200) + .and() + .body(CoreMatchers.is( + "{\"data\":{\"_entities\":[{\"id\":\"id\",\"value\":\"idnamekey\",\"description\":\"extendedTypeByIdNameKey\"}]}}")); + } + + private static final String TEST_ID_QUERY = "query {\n" + + "_entities(\n" + + " representations: { id: \"id\", __typename: \"ExtendedType\" }\n" + + ") {\n" + + " ... on ExtendedType {\n" + + " id\n" + + " description\n" + + " }\n" + + " }\n" + + "}"; + + private static final String TEST_ID_NAME_KEY_QUERY = "query {\n" + + "_entities(\n" + + " representations: { id: \"id\", name: \"name\", key: \"key\", __typename: \"ExtendedType\" }\n" + + ") {\n" + + " ... on ExtendedType {\n" + + " id\n" + + " value\n" + + " description\n" + + " }\n" + + " }\n" + + "}"; +}