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
 }
+

Reply via email to