This is an automated email from the ASF dual-hosted git repository.
radu pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-graphql-core.git
The following commit(s) were added to refs/heads/master by this push:
new 3be37e2 SLING-9819 - Add support for using the Interface type
3be37e2 is described below
commit 3be37e2ef574d6f4da8ecabd147bb9cecef7671d
Author: kozmaadrian <[email protected]>
AuthorDate: Wed Jan 13 11:10:44 2021 +0100
SLING-9819 - Add support for using the Interface type
Co-authored-by: Adrian Kozma <[email protected]>
---
.../graphql/core/engine/DefaultQueryExecutor.java | 37 +++++---
.../core/engine/DefaultQueryExecutorTest.java | 101 ++++++++++++++-------
.../core/engine/IntrospectionQueryTest.java | 19 ++--
.../core/engine/SlingTypeResolverSelectorTest.java | 9 +-
...ypeResolver.java => CharacterTypeResolver.java} | 10 +-
.../core/mocks/{TypeTestDTO.java => DroidDTO.java} | 37 +++-----
.../{TypeSlingResourceDTO.java => HumanDTO.java} | 26 ++++--
.../core/schema/SchemaDescriptionsTest.java | 4 +-
src/test/resources/test-schema.txt | 47 +++++++---
9 files changed, 179 insertions(+), 111 deletions(-)
diff --git
a/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
b/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
index d2a1df6..bed63df 100644
---
a/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
+++
b/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
@@ -23,6 +23,8 @@ import java.util.Map;
import javax.script.ScriptException;
+import graphql.language.InterfaceTypeDefinition;
+import graphql.language.TypeDefinition;
import graphql.language.UnionTypeDefinition;
import graphql.schema.TypeResolver;
import org.apache.sling.api.resource.Resource;
@@ -196,23 +198,31 @@ public class DefaultQueryExecutor implements
QueryExecutor {
});
}
scalars.forEach(builder::scalar);
-
List<UnionTypeDefinition> unionTypes =
typeRegistry.getTypes(UnionTypeDefinition.class);
for (UnionTypeDefinition type : unionTypes) {
- try {
- TypeResolver resolver = getTypeResolver(type, r);
- if (resolver != null) {
- builder.type(type.getName(), typeWriting ->
typeWriting.typeResolver(resolver));
- }
- } catch (SlingGraphQLException e) {
- throw e;
- } catch(Exception e) {
- throw new SlingGraphQLException("Exception while building
wiring.", e);
- }
+ wireTypeResolver(builder, type, r);
}
+ List<InterfaceTypeDefinition> interfaceTypes =
typeRegistry.getTypes(InterfaceTypeDefinition.class);
+ for (InterfaceTypeDefinition type : interfaceTypes) {
+ wireTypeResolver(builder, type, r);
+ }
+
return builder.build();
}
+ private <T extends TypeDefinition<T>> void
wireTypeResolver(RuntimeWiring.Builder builder, TypeDefinition<T> type,
Resource r) {
+ try {
+ TypeResolver resolver = getTypeResolver(type, r);
+ if (resolver != null) {
+ builder.type(type.getName(), typeWriting ->
typeWriting.typeResolver(resolver));
+ }
+ } catch (SlingGraphQLException e) {
+ throw e;
+ } catch(Exception e) {
+ throw new SlingGraphQLException("Exception while building
wiring.", e);
+ }
+ }
+
private String getDirectiveArgumentValue(Directive d, String name) {
final Argument a = d.getArgument(name);
if(a != null && a.getValue() instanceof StringValue) {
@@ -237,8 +247,7 @@ public class DefaultQueryExecutor implements QueryExecutor {
name, SlingTypeResolverSelector.RESOLVER_NAME_PATTERN));
}
- private DataFetcher<Object> getDataFetcher(FieldDefinition field, Resource
currentResource)
- {
+ private DataFetcher<Object> getDataFetcher(FieldDefinition field, Resource
currentResource) {
DataFetcher<Object> result = null;
final Directive d =field.getDirective(FETCHER_DIRECTIVE);
if(d != null) {
@@ -253,7 +262,7 @@ public class DefaultQueryExecutor implements QueryExecutor {
return result;
}
- private TypeResolver getTypeResolver(UnionTypeDefinition typeDefinition,
Resource currentResource) {
+ private <T extends TypeDefinition<T>> TypeResolver
getTypeResolver(TypeDefinition<T> typeDefinition, Resource currentResource) {
TypeResolver resolver = null;
final Directive d = typeDefinition.getDirective(RESOLVER_DIRECTIVE);
if(d != null) {
diff --git
a/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
b/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
index 228e6c6..1ff6b1c 100644
---
a/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
+++
b/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
@@ -38,9 +38,9 @@ import org.apache.sling.graphql.core.mocks.EchoDataFetcher;
import org.apache.sling.graphql.core.mocks.FailingDataFetcher;
import org.apache.sling.graphql.core.mocks.MockSchemaProvider;
import org.apache.sling.graphql.core.mocks.TestUtil;
-import org.apache.sling.graphql.core.mocks.TypeSlingResourceDTO;
-import org.apache.sling.graphql.core.mocks.TypeTestDTO;
-import org.apache.sling.graphql.core.mocks.UnionTypeResolver;
+import org.apache.sling.graphql.core.mocks.DroidDTO;
+import org.apache.sling.graphql.core.mocks.HumanDTO;
+import org.apache.sling.graphql.core.mocks.CharacterTypeResolver;
import org.junit.Test;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
@@ -56,7 +56,6 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
public class DefaultQueryExecutorTest extends ResourceQueryTestBase {
@@ -64,20 +63,28 @@ public class DefaultQueryExecutorTest extends
ResourceQueryTestBase {
final Dictionary<String, Object> staticData = new Hashtable<>();
staticData.put("test", true);
- final Dictionary<String, Object> unionData = new Hashtable<>();
- final List<Object> items = new ArrayList<>();
- items.add(new TypeTestDTO(true, false, "path/to/resource", "1, 2, 3"));
- items.add(new TypeSlingResourceDTO(resource.getPath(),
resource.getResourceType()));
- unionData.put("items", items);
+ HumanDTO human = new HumanDTO("human-1", "Luke", "Tatooine");
+ DroidDTO droid = new DroidDTO("droid-1", "R2-D2", "whistle");
- TestUtil.registerSlingTypeResolver(context.bundleContext(),
"union/resolver", new UnionTypeResolver());
- TestUtil.registerSlingDataFetcher(context.bundleContext(),
"union/fetcher", new EchoDataFetcher(unionData));
+ final List<Object> characters = new ArrayList<>();
+ characters.add(human);
+ characters.add(droid);
+
+ final Dictionary<String, Object> data = new Hashtable<>();
+ data.put("characters", characters);
+
+ TestUtil.registerSlingTypeResolver(context.bundleContext(),
"character/resolver", new CharacterTypeResolver());
+ TestUtil.registerSlingDataFetcher(context.bundleContext(),
"character/fetcher", new EchoDataFetcher(data));
TestUtil.registerSlingDataFetcher(context.bundleContext(),
"echoNS/echo", new EchoDataFetcher(null));
TestUtil.registerSlingDataFetcher(context.bundleContext(),
"failure/fail", new FailingDataFetcher());
TestUtil.registerSlingDataFetcher(context.bundleContext(),
"test/static", new EchoDataFetcher(staticData));
TestUtil.registerSlingDataFetcher(context.bundleContext(),
"test/fortyTwo", new EchoDataFetcher(42));
TestUtil.registerSlingDataFetcher(context.bundleContext(),
"sling/digest", new DigestDataFetcher());
- TestUtil.registerSlingDataFetcher(context.bundleContext(),
"combined/fetcher", new EchoDataFetcher(unionData));
+
+ final Dictionary<String, Object> dataCombined = new Hashtable<>();
+ dataCombined.put("unionTest", characters);
+ dataCombined.put("interfaceTest", characters);
+ TestUtil.registerSlingDataFetcher(context.bundleContext(),
"combined/fetcher", new EchoDataFetcher(dataCombined));
}
@Test
@@ -189,16 +196,30 @@ public class DefaultQueryExecutorTest extends
ResourceQueryTestBase {
}
@Test
- public void unionFetcherTest() throws Exception {
- final String json = queryJSON("{ unionFetcher { items { ... on Test {
testingArgument } ... on SlingResource { path }} } }");
- assertThat(json, hasJsonPath("$.data.unionFetcher"));
- assertThat(json,
hasJsonPath("$.data.unionFetcher.items[0].testingArgument", equalTo("1, 2,
3")));
- assertThat(json, hasJsonPath("$.data.unionFetcher.items[1].path",
equalTo(resource.getPath())));
+ public void unionQueryTest() throws Exception {
+ final String json = queryJSON("{ unionQuery { characters { ... on
Human { name address } ... on Droid { name primaryFunction } } } }");
+ assertThat(json, hasJsonPath("$.data.unionQuery"));
+ assertThat(json, hasJsonPath("$.data.unionQuery.characters[0].name",
equalTo("Luke")));
+ assertThat(json,
hasJsonPath("$.data.unionQuery.characters[0].address", equalTo("Tatooine")));
+ assertThat(json, hasJsonPath("$.data.unionQuery.characters[1].name",
equalTo("R2-D2")));
+ assertThat(json,
hasJsonPath("$.data.unionQuery.characters[1].primaryFunction",
equalTo("whistle")));
+ }
+
+ @Test
+ public void interfaceQueryTest() throws Exception {
+ final String json = queryJSON("{ interfaceQuery { characters { id ...
on Human { name address } ... on Droid { name primaryFunction } } } }");
+ assertThat(json, hasJsonPath("$.data.interfaceQuery"));
+ assertThat(json, hasJsonPath("$.data.interfaceQuery.characters[0].id",
equalTo("human-1")));
+ assertThat(json,
hasJsonPath("$.data.interfaceQuery.characters[0].name", equalTo("Luke")));
+ assertThat(json,
hasJsonPath("$.data.interfaceQuery.characters[0].address",
equalTo("Tatooine")));
+ assertThat(json, hasJsonPath("$.data.interfaceQuery.characters[1].id",
equalTo("droid-1")));
+ assertThat(json,
hasJsonPath("$.data.interfaceQuery.characters[1].name", equalTo("R2-D2")));
+ assertThat(json,
hasJsonPath("$.data.interfaceQuery.characters[1].primaryFunction",
equalTo("whistle")));
}
@Test
public void selectionSetTest() throws Exception {
- queryJSON("{ combinedFetcher { boolValue resourcePath aTest {
boolValue test resourcePath } allTests { boolValue test resourcePath } items {
... on Test { testingArgument } ... on SlingResource { path }} } }");
+ queryJSON("{ combinedFetcher { boolValue resourcePath aTest {
boolValue test resourcePath } allTests { boolValue test resourcePath }
unionTest { ... on Human { id address } ... on Droid { id primaryFunction } }
interfaceTest { id ... on Human { address } ... on Droid { primaryFunction } }
} }");
// retrieve the service used
ServiceReference<?>[] serviceReferences =
context.bundleContext().getServiceReferences(SlingDataFetcher.class.getName(),
"(name=combined/fetcher)");
@@ -207,13 +228,14 @@ public class DefaultQueryExecutorTest extends
ResourceQueryTestBase {
// Access the computed SelectionSet
SelectionSet selectionSet = echoDataFetcher.getSelectionSet();
- assertEquals(5, selectionSet.getFields().size());
+ assertEquals(6, selectionSet.getFields().size());
String[] expectedFieldNames = new String[] {
"boolValue",
"resourcePath",
"aTest",
- "items"
+ "unionTest",
+ "interfaceTest"
};
final List<SelectedField> selectionSetFields =
selectionSet.getFields();
for (String expectedFieldname : expectedFieldNames) {
@@ -232,11 +254,19 @@ public class DefaultQueryExecutorTest extends
ResourceQueryTestBase {
"allTests/test",
"allTests/boolValue",
"allTests/resourcePath",
- "items",
- "items/Test",
- "items/Test/testingArgument",
- "items/SlingResource",
- "items/SlingResource/path"
+ "unionTest",
+ "unionTest/Human",
+ "unionTest/Human/id",
+ "unionTest/Human/address",
+ "unionTest/Droid",
+ "unionTest/Droid/id",
+ "unionTest/Droid/primaryFunction",
+ "interfaceTest",
+ "interfaceTest/id",
+ "interfaceTest/Human",
+ "interfaceTest/Human/address",
+ "interfaceTest/Droid",
+ "interfaceTest/Droid/primaryFunction"
};
for (String expectedQN : expectedQualifiedName) {
assertTrue(selectionSet.contains(expectedQN));
@@ -253,17 +283,25 @@ public class DefaultQueryExecutorTest extends
ResourceQueryTestBase {
"allTests/test",
"allTests/boolValue",
"allTests/resourcePath",
- "items",
- "items/Test/testingArgument",
- "items/SlingResource/path"
+ "unionTest",
+ "unionTest/Human/id",
+ "unionTest/Human/address",
+ "unionTest/Droid/id",
+ "unionTest/Droid/primaryFunction",
+ "interfaceTest",
+ "interfaceTest/id",
+ "interfaceTest/Human/address",
+ "interfaceTest/Droid/primaryFunction"
};
for (String expectedNonInlineQN : expectedNonInlineQNs) {
assertFalse(Objects.requireNonNull(selectionSet.get(expectedNonInlineQN)).isInline());
}
String[] expectedInlineQNs = new String[] {
- "items/Test",
- "items/SlingResource"
+ "unionTest/Human",
+ "unionTest/Droid",
+ "interfaceTest/Human",
+ "interfaceTest/Droid"
};
for (String expectedInlineQN : expectedInlineQNs) {
assertTrue(Objects.requireNonNull(selectionSet.get(expectedInlineQN)).isInline());
@@ -281,7 +319,6 @@ public class DefaultQueryExecutorTest extends
ResourceQueryTestBase {
for (String expectedSubFieldname : expectedSubFieldNames) {
assertTrue(subSelectedFields.stream().anyMatch(f ->
expectedSubFieldname.equals(f.getName())));
}
-
-
}
+
}
diff --git
a/src/test/java/org/apache/sling/graphql/core/engine/IntrospectionQueryTest.java
b/src/test/java/org/apache/sling/graphql/core/engine/IntrospectionQueryTest.java
index 227a49f..07c536c 100644
---
a/src/test/java/org/apache/sling/graphql/core/engine/IntrospectionQueryTest.java
+++
b/src/test/java/org/apache/sling/graphql/core/engine/IntrospectionQueryTest.java
@@ -26,27 +26,26 @@ import java.util.List;
import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath;
import static org.junit.Assert.assertThat;
-import static org.hamcrest.Matchers.contains;
import org.apache.sling.graphql.core.mocks.EchoDataFetcher;
import org.apache.sling.graphql.core.mocks.TestUtil;
-import org.apache.sling.graphql.core.mocks.TypeSlingResourceDTO;
-import org.apache.sling.graphql.core.mocks.TypeTestDTO;
-import org.apache.sling.graphql.core.mocks.UnionTypeResolver;
+import org.apache.sling.graphql.core.mocks.DroidDTO;
+import org.apache.sling.graphql.core.mocks.HumanDTO;
+import org.apache.sling.graphql.core.mocks.CharacterTypeResolver;
import org.junit.Test;
public class IntrospectionQueryTest extends ResourceQueryTestBase {
@Override
protected void setupAdditionalServices() {
- final Dictionary<String, Object> unionData = new Hashtable<>();
+ final Dictionary<String, Object> data = new Hashtable<>();
final List<Object> items = new ArrayList<>();
- items.add(new TypeTestDTO(true, false, "path/to/resource", "1, 2, 3"));
- items.add(new TypeSlingResourceDTO(resource.getPath(),
resource.getResourceType()));
- unionData.put("items", items);
+ items.add(new HumanDTO("human-1", "Luke", "Tatooine"));
+ items.add(new DroidDTO("droid-1", "R2-D2", "whistle"));
+ data.put("items", items);
- TestUtil.registerSlingTypeResolver(context.bundleContext(),
"union/resolver", new UnionTypeResolver());
- TestUtil.registerSlingDataFetcher(context.bundleContext(),
"union/fetcher", new EchoDataFetcher(unionData));
+ TestUtil.registerSlingTypeResolver(context.bundleContext(),
"character/resolver", new CharacterTypeResolver());
+ TestUtil.registerSlingDataFetcher(context.bundleContext(),
"character/fetcher", new EchoDataFetcher(data));
}
@Test
diff --git
a/src/test/java/org/apache/sling/graphql/core/engine/SlingTypeResolverSelectorTest.java
b/src/test/java/org/apache/sling/graphql/core/engine/SlingTypeResolverSelectorTest.java
index db0f254..6bcc5b2 100644
---
a/src/test/java/org/apache/sling/graphql/core/engine/SlingTypeResolverSelectorTest.java
+++
b/src/test/java/org/apache/sling/graphql/core/engine/SlingTypeResolverSelectorTest.java
@@ -22,7 +22,7 @@ import org.apache.sling.graphql.api.SlingTypeResolver;
import org.apache.sling.graphql.api.SlingTypeResolverEnvironment;
import org.apache.sling.graphql.core.mocks.DummyTypeResolver;
import org.apache.sling.graphql.core.mocks.TestUtil;
-import org.apache.sling.graphql.core.mocks.UnionTypeResolver;
+import org.apache.sling.graphql.core.mocks.CharacterTypeResolver;
import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
import org.junit.Before;
import org.junit.Rule;
@@ -36,7 +36,6 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
public class SlingTypeResolverSelectorTest {
@@ -51,11 +50,11 @@ public class SlingTypeResolverSelectorTest {
context.registerInjectActivateService(new SlingTypeResolverSelector());
selector = context.getService(SlingTypeResolverSelector.class);
- TestUtil.registerSlingTypeResolver(context.bundleContext(),
"sling/union", new UnionTypeResolver());
+ TestUtil.registerSlingTypeResolver(context.bundleContext(),
"sling/character", new CharacterTypeResolver());
TestUtil.registerSlingTypeResolver(context.bundleContext(),
"sling/shouldFail", new DoNothingTypeResolver());
TestUtil.registerSlingTypeResolver(context.bundleContext(),
"example/ok", new DoNothingTypeResolver());
TestUtil.registerSlingTypeResolver(context.bundleContext(),
"sling/duplicate", 1, new DummyTypeResolver());
- TestUtil.registerSlingTypeResolver(context.bundleContext(),
"sling/duplicate", 0, new UnionTypeResolver());
+ TestUtil.registerSlingTypeResolver(context.bundleContext(),
"sling/duplicate", 0, new CharacterTypeResolver());
}
@Test
@@ -66,7 +65,7 @@ public class SlingTypeResolverSelectorTest {
@Test
public void reservedNameOk() {
- final SlingTypeResolver<Object> sdf =
selector.getSlingTypeResolver("sling/union");
+ final SlingTypeResolver<Object> sdf =
selector.getSlingTypeResolver("sling/character");
assertThat(sdf, not(nullValue()));
}
diff --git
a/src/test/java/org/apache/sling/graphql/core/mocks/UnionTypeResolver.java
b/src/test/java/org/apache/sling/graphql/core/mocks/CharacterTypeResolver.java
similarity index 82%
rename from
src/test/java/org/apache/sling/graphql/core/mocks/UnionTypeResolver.java
rename to
src/test/java/org/apache/sling/graphql/core/mocks/CharacterTypeResolver.java
index 61ccc0c..6764801 100644
--- a/src/test/java/org/apache/sling/graphql/core/mocks/UnionTypeResolver.java
+++
b/src/test/java/org/apache/sling/graphql/core/mocks/CharacterTypeResolver.java
@@ -24,17 +24,17 @@ import
org.apache.sling.graphql.api.SlingTypeResolverEnvironment;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-public class UnionTypeResolver implements SlingTypeResolver<Object> {
+public class CharacterTypeResolver implements SlingTypeResolver<Object> {
@Nullable
@Override
public Object getType(@NotNull SlingTypeResolverEnvironment e) {
Object resultItem = e.getObject();
- if (resultItem instanceof TypeTestDTO) {
- return e.getObjectType("Test");
+ if (resultItem instanceof HumanDTO) {
+ return e.getObjectType("Human");
}
- if (resultItem instanceof TypeSlingResourceDTO) {
- return e.getObjectType("SlingResource");
+ if (resultItem instanceof DroidDTO) {
+ return e.getObjectType("Droid");
}
return null;
}
diff --git a/src/test/java/org/apache/sling/graphql/core/mocks/TypeTestDTO.java
b/src/test/java/org/apache/sling/graphql/core/mocks/DroidDTO.java
similarity index 59%
rename from src/test/java/org/apache/sling/graphql/core/mocks/TypeTestDTO.java
rename to src/test/java/org/apache/sling/graphql/core/mocks/DroidDTO.java
index 2e087ae..046b631 100644
--- a/src/test/java/org/apache/sling/graphql/core/mocks/TypeTestDTO.java
+++ b/src/test/java/org/apache/sling/graphql/core/mocks/DroidDTO.java
@@ -18,33 +18,26 @@
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
package org.apache.sling.graphql.core.mocks;
-public class TypeTestDTO {
- private final boolean test;
- private final boolean boolValue;
- private final String resourcePath;
- private final String testingArgument;
+public class DroidDTO {
+ private final String id;
+ private final String name;
+ private final String primaryFunction;
- public TypeTestDTO(boolean test, boolean boolValue, String resourcePath,
String testingArgument) {
- this.test = test;
- this.boolValue = boolValue;
- this.resourcePath = resourcePath;
- this.testingArgument = testingArgument;
+ public DroidDTO(String id, String name, String primaryFunction) {
+ this.id = id;
+ this.name = name;
+ this.primaryFunction = primaryFunction;
}
- public boolean isTest() {
- return test;
+ public String getId() {
+ return id;
}
- public boolean isBoolValue() {
- return boolValue;
+ public String getName() {
+ return name;
}
- public String getResourcePath() {
- return resourcePath;
+ public String getPrimaryFunction() {
+ return primaryFunction;
}
-
- public String getTestingArgument() {
- return testingArgument;
- }
-
-}
+}
\ No newline at end of file
diff --git
a/src/test/java/org/apache/sling/graphql/core/mocks/TypeSlingResourceDTO.java
b/src/test/java/org/apache/sling/graphql/core/mocks/HumanDTO.java
similarity index 70%
rename from
src/test/java/org/apache/sling/graphql/core/mocks/TypeSlingResourceDTO.java
rename to src/test/java/org/apache/sling/graphql/core/mocks/HumanDTO.java
index fa1339f..fbad3f9 100644
---
a/src/test/java/org/apache/sling/graphql/core/mocks/TypeSlingResourceDTO.java
+++ b/src/test/java/org/apache/sling/graphql/core/mocks/HumanDTO.java
@@ -18,20 +18,26 @@
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
package org.apache.sling.graphql.core.mocks;
-public class TypeSlingResourceDTO {
- private final String path;
- private final String resourceType;
+public class HumanDTO {
+ private final String id;
+ private final String name;
+ private final String address;
- public TypeSlingResourceDTO(String path, String resourceType) {
- this.path = path;
- this.resourceType = resourceType;
+ public HumanDTO(String id, String name, String address) {
+ this.id = id;
+ this.name = name;
+ this.address = address;
}
- public String getPath() {
- return path;
+ public String getId() {
+ return id;
}
- public String getResourceType() {
- return resourceType;
+ public String getName() {
+ return name;
+ }
+
+ public String getTotalCredits() {
+ return address;
}
}
diff --git
a/src/test/java/org/apache/sling/graphql/core/schema/SchemaDescriptionsTest.java
b/src/test/java/org/apache/sling/graphql/core/schema/SchemaDescriptionsTest.java
index 2c093ba..576ee9d 100644
---
a/src/test/java/org/apache/sling/graphql/core/schema/SchemaDescriptionsTest.java
+++
b/src/test/java/org/apache/sling/graphql/core/schema/SchemaDescriptionsTest.java
@@ -33,7 +33,7 @@ import
org.apache.sling.graphql.core.engine.SlingDataFetcherSelector;
import org.apache.sling.graphql.core.engine.SlingTypeResolverSelector;
import org.apache.sling.graphql.core.mocks.MockSchemaProvider;
import org.apache.sling.graphql.core.mocks.TestUtil;
-import org.apache.sling.graphql.core.mocks.UnionTypeResolver;
+import org.apache.sling.graphql.core.mocks.CharacterTypeResolver;
import org.apache.sling.graphql.core.scalars.SlingScalarsProvider;
import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
import org.hamcrest.CustomMatcher;
@@ -107,7 +107,7 @@ public class SchemaDescriptionsTest {
context.bundleContext().registerService(ServletResolver.class,
servletResolver, null);
context.registerInjectActivateService(new SlingDataFetcherSelector());
context.registerInjectActivateService(new SlingTypeResolverSelector());
- TestUtil.registerSlingTypeResolver(context.bundleContext(),
"union/resolver", new UnionTypeResolver());
+ TestUtil.registerSlingTypeResolver(context.bundleContext(),
"character/resolver", new CharacterTypeResolver());
context.registerInjectActivateService(new SlingScalarsProvider());
context.registerService(SchemaProvider.class, new
MockSchemaProvider("test-schema"));
context.registerInjectActivateService(new RankedSchemaProviders());
diff --git a/src/test/resources/test-schema.txt
b/src/test/resources/test-schema.txt
index 9b1527d..e7fb1b0 100644
--- a/src/test/resources/test-schema.txt
+++ b/src/test/resources/test-schema.txt
@@ -27,7 +27,7 @@ directive @resolver(
name : String,
options : String = "",
source : String = ""
-) on UNION
+) on UNION | INTERFACE
# GraphQL Schema used for our tests
type Query {
@@ -36,14 +36,21 @@ type Query {
# Test some static values
staticContent: Test @fetcher(name:"test/static")
- # Test union as return type
- unionFetcher: Test2 @fetcher(name:"union/fetcher")
-
# Test combined as return type
- combinedFetcher: Test3 @fetcher(name:"combined/fetcher")
+ combinedFetcher: Test2 @fetcher(name:"combined/fetcher")
+
+ # Test union query
+ unionQuery: CharactersAsUnion @fetcher(name:"character/fetcher")
+
+ # Test interface query
+ interfaceQuery: CharactersAsInterface @fetcher(name:"character/fetcher")
+}
+
+interface CharacterInterface @resolver(name:"character/resolver"
source:"CharacterInterface") {
+ id: ID!
}
-union AllTypes @resolver(name:"union/resolver" source:"AllTypes") =
SlingResource | Test
+union CharacterUnion @resolver(name:"character/resolver"
source:"CharacterUnion") = Human | Droid
# This should be omitted from the SlingResource type description
#
@@ -74,13 +81,31 @@ type Test {
}
type Test2 {
- items: [AllTypes]
-}
-
-type Test3 {
boolValue: Boolean
resourcePath: String
aTest: Test
allTests: [Test]
- items: [AllTypes]
+ unionTest: [CharacterUnion]
+ interfaceTest: [CharacterInterface]
+}
+
+type CharactersAsUnion {
+ characters: [CharacterUnion]
+}
+
+type CharactersAsInterface {
+ characters: [CharacterInterface]
+}
+
+type Human implements CharacterInterface {
+ id: ID!
+ name: String!
+ address: String
+}
+
+type Droid implements CharacterInterface {
+ id: ID!
+ name: String!
+ primaryFunction: String
}
+