diff --git a/ezyhttp-client/pom.xml b/ezyhttp-client/pom.xml index 8168a2a4..0aa02aa4 100644 --- a/ezyhttp-client/pom.xml +++ b/ezyhttp-client/pom.xml @@ -5,7 +5,7 @@ com.tvd12 ezyhttp - 1.5.2 + 1.5.3 ezyhttp-client diff --git a/ezyhttp-core/pom.xml b/ezyhttp-core/pom.xml index dc2dc606..c6659cb2 100644 --- a/ezyhttp-core/pom.xml +++ b/ezyhttp-core/pom.xml @@ -5,7 +5,7 @@ com.tvd12 ezyhttp - 1.5.2 + 1.5.3 ezyhttp-core diff --git a/ezyhttp-server-boot/pom.xml b/ezyhttp-server-boot/pom.xml index 151868a6..d9791c52 100644 --- a/ezyhttp-server-boot/pom.xml +++ b/ezyhttp-server-boot/pom.xml @@ -5,7 +5,7 @@ com.tvd12 ezyhttp - 1.5.2 + 1.5.3 ezyhttp-server-boot diff --git a/ezyhttp-server-core/pom.xml b/ezyhttp-server-core/pom.xml index 27a2fee0..ef6f578a 100644 --- a/ezyhttp-server-core/pom.xml +++ b/ezyhttp-server-core/pom.xml @@ -5,7 +5,7 @@ com.tvd12 ezyhttp - 1.5.2 + 1.5.3 ezyhttp-server-core diff --git a/ezyhttp-server-core/src/main/java/com/tvd12/ezyhttp/server/core/manager/RequestHandlerManager.java b/ezyhttp-server-core/src/main/java/com/tvd12/ezyhttp/server/core/manager/RequestHandlerManager.java index 3dcf4226..5bb0c421 100644 --- a/ezyhttp-server-core/src/main/java/com/tvd12/ezyhttp/server/core/manager/RequestHandlerManager.java +++ b/ezyhttp-server-core/src/main/java/com/tvd12/ezyhttp/server/core/manager/RequestHandlerManager.java @@ -1,13 +1,5 @@ package com.tvd12.ezyhttp.server.core.manager; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - import com.tvd12.ezyfox.io.EzyStrings; import com.tvd12.ezyfox.util.EzyDestroyable; import com.tvd12.ezyfox.util.EzyLoggable; @@ -16,10 +8,18 @@ import com.tvd12.ezyhttp.server.core.exception.DuplicateURIMappingHandlerException; import com.tvd12.ezyhttp.server.core.handler.RequestHandler; import com.tvd12.ezyhttp.server.core.request.RequestURI; - import lombok.Getter; import lombok.Setter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + public class RequestHandlerManager extends EzyLoggable implements EzyDestroyable { @Setter @@ -70,10 +70,11 @@ public RequestHandler getHandler( } public void addHandler(RequestURI uri, RequestHandler handler) { - RequestHandler old = this.handlers.put(uri, handler); + RequestHandler old = this.handlers.get(uri); if (old != null && !allowOverrideURI) { throw new DuplicateURIMappingHandlerException(uri, old, handler); } + this.handlers.put(uri, handler); this.handledURIs.add(uri.getUri()); this.logger.info("add mapping uri: {}", uri); this.handlerListByURI @@ -118,7 +119,15 @@ public void addHandlers(Map> handlers) { } public Map> getHandlerListByURI() { - return Collections.unmodifiableMap(handlerListByURI); + return handlerListByURI + .entrySet() + .stream() + .collect( + Collectors.toMap( + Map.Entry::getKey, + it -> Collections.unmodifiableList(it.getValue()) + ) + ); } @Override diff --git a/ezyhttp-server-core/src/main/java/com/tvd12/ezyhttp/server/core/servlet/BlockingServlet.java b/ezyhttp-server-core/src/main/java/com/tvd12/ezyhttp/server/core/servlet/BlockingServlet.java index b3848d1b..ac28a0de 100644 --- a/ezyhttp-server-core/src/main/java/com/tvd12/ezyhttp/server/core/servlet/BlockingServlet.java +++ b/ezyhttp-server-core/src/main/java/com/tvd12/ezyhttp/server/core/servlet/BlockingServlet.java @@ -18,7 +18,11 @@ import com.tvd12.ezyhttp.server.core.handler.UncaughtExceptionHandler; import com.tvd12.ezyhttp.server.core.handler.UnhandledErrorHandler; import com.tvd12.ezyhttp.server.core.interceptor.RequestInterceptor; -import com.tvd12.ezyhttp.server.core.manager.*; +import com.tvd12.ezyhttp.server.core.manager.ComponentManager; +import com.tvd12.ezyhttp.server.core.manager.ExceptionHandlerManager; +import com.tvd12.ezyhttp.server.core.manager.InterceptorManager; +import com.tvd12.ezyhttp.server.core.manager.RequestHandlerManager; +import com.tvd12.ezyhttp.server.core.manager.RequestURIManager; import com.tvd12.ezyhttp.server.core.request.RequestArguments; import com.tvd12.ezyhttp.server.core.request.SimpleRequestArguments; import com.tvd12.ezyhttp.server.core.view.Redirect; @@ -29,7 +33,6 @@ import javax.servlet.AsyncContext; import javax.servlet.AsyncListener; -import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; @@ -38,7 +41,11 @@ import java.io.IOException; import java.lang.reflect.Method; import java.net.URLDecoder; -import java.util.*; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Map.Entry; public class BlockingServlet extends HttpServlet { @@ -64,7 +71,7 @@ public class BlockingServlet extends HttpServlet { protected final Logger logger = LoggerFactory.getLogger(getClass()); @Override - public void init() throws ServletException { + public void init() { this.componentManager = ComponentManager.getInstance(); this.debug = componentManager.isDebug(); this.managementPort = componentManager.getManagementPort(); diff --git a/ezyhttp-server-graphql/pom.xml b/ezyhttp-server-graphql/pom.xml index d0af9d15..a92e7d76 100644 --- a/ezyhttp-server-graphql/pom.xml +++ b/ezyhttp-server-graphql/pom.xml @@ -6,7 +6,7 @@ com.tvd12 ezyhttp - 1.5.2 + 1.5.3 ezyhttp-server-graphql ezyhttp-server-graphql diff --git a/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/config/GraphQLConfiguration.java b/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/config/GraphQLConfiguration.java index f7aadf2e..23dd66f5 100644 --- a/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/config/GraphQLConfiguration.java +++ b/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/config/GraphQLConfiguration.java @@ -10,6 +10,7 @@ import com.tvd12.ezyhttp.server.graphql.data.GraphQLDataFilter; import com.tvd12.ezyhttp.server.graphql.fetcher.GraphQLDataFetcher; import com.tvd12.ezyhttp.server.graphql.fetcher.GraphQLDataFetcherManager; +import com.tvd12.ezyhttp.server.graphql.fetcher.GraphQLDataFetcherProvider; import com.tvd12.ezyhttp.server.graphql.interceptor.GraphQLInterceptorManager; import com.tvd12.ezyhttp.server.graphql.json.GraphQLObjectMapperFactory; import com.tvd12.ezyhttp.server.graphql.scheme.GraphQLSchemaParser; @@ -52,7 +53,10 @@ public void config() { for (GraphQLDataFetcher dataFetcher : dataFetchers) { dataFetcherManagerBuilder.addDataFetcher(dataFetcher); } + GraphQLDataFetcherProvider dataFetcherProvider = singletonFactory + .getSingletonCast(GraphQLDataFetcherProvider.class); GraphQLDataFetcherManager dataFetcherManager = dataFetcherManagerBuilder + .dataFetcherProvider(dataFetcherProvider) .build(); GraphQLInterceptorManager interceptorManager = new GraphQLInterceptorManager(singletonFactory); diff --git a/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/data/GraphQLDataFilter.java b/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/data/GraphQLDataFilter.java index 346a471c..f0a1230c 100644 --- a/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/data/GraphQLDataFilter.java +++ b/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/data/GraphQLDataFilter.java @@ -4,7 +4,13 @@ import com.tvd12.ezyhttp.server.graphql.exception.GraphQLInvalidSchemeException; import lombok.AllArgsConstructor; -import java.util.*; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; import static com.tvd12.ezyhttp.server.graphql.constants.GraphQLConstants.ALL_FIELDS; @@ -39,6 +45,9 @@ public Map filter( for (GraphQLField field : entry.field.getFields()) { String fieldName = field.getName(); + if (entry.data == null) { + continue; + } Object value = entry.data.get(fieldName); if (value == null) { continue; diff --git a/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/fetcher/GraphQLDataFetcher.java b/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/fetcher/GraphQLDataFetcher.java index 15e8733d..d5218f5e 100644 --- a/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/fetcher/GraphQLDataFetcher.java +++ b/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/fetcher/GraphQLDataFetcher.java @@ -3,9 +3,7 @@ import com.tvd12.ezyfox.exception.EzyNotImplementedException; import com.tvd12.ezyhttp.server.core.request.RequestArguments; import com.tvd12.ezyhttp.server.graphql.query.GraphQLQueryDefinition; -import com.tvd12.ezyhttp.server.graphql.scheme.GraphQLDataSchema; - -import java.util.List; +import com.tvd12.ezyhttp.server.graphql.scheme.GraphQLDataFetcherSchema; import static com.tvd12.ezyhttp.server.graphql.util.GraphQLQueryAnnotations.getQLQueryGroupName; import static com.tvd12.ezyhttp.server.graphql.util.GraphQLQueryAnnotations.getQLQueryName; @@ -32,11 +30,7 @@ default String getQueryGroupName() { return getQLQueryGroupName(getClass()); } - default List getQueryScheme() { - return null; - } - - default GraphQLDataSchema getResponseScheme() { + default GraphQLDataFetcherSchema getSchema() { return null; } } diff --git a/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/fetcher/GraphQLDataFetcherManager.java b/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/fetcher/GraphQLDataFetcherManager.java index a54a3ab6..3861f85a 100644 --- a/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/fetcher/GraphQLDataFetcherManager.java +++ b/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/fetcher/GraphQLDataFetcherManager.java @@ -2,12 +2,20 @@ import com.tvd12.ezyfox.builder.EzyBuilder; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import static com.tvd12.ezyfox.io.EzyStrings.isBlank; import static com.tvd12.ezyhttp.server.graphql.constants.GraphQLConstants.DEFAULT_QL_GROUP_NAME; -import static com.tvd12.ezyhttp.server.graphql.util.GraphQLDataFetcherClasses.*; +import static com.tvd12.ezyhttp.server.graphql.util.GraphQLDataFetcherClasses.isAuthenticatedFetcher; +import static com.tvd12.ezyhttp.server.graphql.util.GraphQLDataFetcherClasses.isManagementFetcher; +import static com.tvd12.ezyhttp.server.graphql.util.GraphQLDataFetcherClasses.isPaymentFetcher; public class GraphQLDataFetcherManager { @@ -17,6 +25,7 @@ public class GraphQLDataFetcherManager { private final Set paymentQueryNames; private final Map groupNameByQueryName; private final Map> queryNamesByGroupName; + private final GraphQLDataFetcherProvider dataFetcherProvider; protected GraphQLDataFetcherManager(Builder builder) { this.dataFetchers = builder.dataFetchers; @@ -25,6 +34,32 @@ protected GraphQLDataFetcherManager(Builder builder) { this.paymentQueryNames = builder.paymentQueryNames; this.groupNameByQueryName = builder.groupNameByQueryName; this.queryNamesByGroupName = builder.queryNamesByGroupName; + this.dataFetcherProvider = builder.dataFetcherProvider; + } + + public void addDataFetcher( + String queryName, + GraphQLDataFetcher fetcher + ) { + this.dataFetchers.put(queryName, fetcher); + if (isAuthenticatedFetcher(fetcher)) { + this.authenticatedQueryNames.add(queryName); + } + if (isManagementFetcher(fetcher)) { + this.managementQueryNames.add(queryName); + } + if (isPaymentFetcher(fetcher)) { + this.paymentQueryNames.add(queryName); + } + String groupName = fetcher.getQueryGroupName(); + if (isBlank(groupName)) { + groupName = DEFAULT_QL_GROUP_NAME; + } + this.groupNameByQueryName.put(queryName, groupName); + this.queryNamesByGroupName.computeIfAbsent( + groupName, + k -> ConcurrentHashMap.newKeySet() + ).add(queryName); } public String getGroupNameByQueryName(String queryName) { @@ -32,7 +67,12 @@ public String getGroupNameByQueryName(String queryName) { } public GraphQLDataFetcher getDataFetcher(String queryName) { - return dataFetchers.get(queryName); + GraphQLDataFetcher fetcher = dataFetchers + .get(queryName); + if (fetcher == null && dataFetcherProvider != null) { + fetcher = dataFetcherProvider.provide(queryName); + } + return fetcher; } public Map> getQueryNameByGroupName() { @@ -74,17 +114,18 @@ public static Builder builder() { public static class Builder implements EzyBuilder { private final Map dataFetchers = - new HashMap<>(); + new ConcurrentHashMap<>(); private final Set authenticatedQueryNames = - new HashSet<>(); + ConcurrentHashMap.newKeySet(); private final Set managementQueryNames = - new HashSet<>(); + ConcurrentHashMap.newKeySet(); private final Set paymentQueryNames = - new HashSet<>(); + ConcurrentHashMap.newKeySet(); private final Map groupNameByQueryName = - new HashMap<>(); + new ConcurrentHashMap<>(); private final Map> queryNamesByGroupName = - new HashMap<>(); + new ConcurrentHashMap<>(); + private GraphQLDataFetcherProvider dataFetcherProvider; public Builder addDataFetcher(GraphQLDataFetcher fetcher) { return addDataFetcher(fetcher.getQueryName(), fetcher); @@ -111,11 +152,18 @@ public Builder addDataFetcher( this.groupNameByQueryName.put(queryName, groupName); this.queryNamesByGroupName.computeIfAbsent( groupName, - k -> new HashSet<>() + k -> ConcurrentHashMap.newKeySet() ).add(queryName); return this; } + public Builder dataFetcherProvider( + GraphQLDataFetcherProvider dataFetcherProvider + ) { + this.dataFetcherProvider = dataFetcherProvider; + return this; + } + @Override public GraphQLDataFetcherManager build() { return new GraphQLDataFetcherManager(this); diff --git a/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/fetcher/GraphQLDataFetcherProvider.java b/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/fetcher/GraphQLDataFetcherProvider.java new file mode 100644 index 00000000..ee828d96 --- /dev/null +++ b/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/fetcher/GraphQLDataFetcherProvider.java @@ -0,0 +1,6 @@ +package com.tvd12.ezyhttp.server.graphql.fetcher; + +public interface GraphQLDataFetcherProvider { + + GraphQLDataFetcher provide(String queryName); +} diff --git a/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/scheme/GraphQLDataFetcherSchema.java b/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/scheme/GraphQLDataFetcherSchema.java new file mode 100644 index 00000000..629600f1 --- /dev/null +++ b/ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/scheme/GraphQLDataFetcherSchema.java @@ -0,0 +1,43 @@ +package com.tvd12.ezyhttp.server.graphql.scheme; + +import com.tvd12.ezyfox.builder.EzyBuilder; +import lombok.Getter; +import lombok.ToString; + +import java.util.List; + +@Getter +@ToString +public class GraphQLDataFetcherSchema { + protected final List queryScheme; + protected final GraphQLDataSchema getResponseScheme; + + protected GraphQLDataFetcherSchema(Builder builder) { + this.queryScheme = builder.queryScheme; + this.getResponseScheme = builder.getResponseScheme; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder implements EzyBuilder { + protected List queryScheme; + protected GraphQLDataSchema getResponseScheme; + + public Builder queryScheme(List queryScheme) { + this.queryScheme = queryScheme; + return this; + } + + public Builder getResponseScheme(GraphQLDataSchema getResponseScheme) { + this.getResponseScheme = getResponseScheme; + return this; + } + + @Override + public GraphQLDataFetcherSchema build() { + return new GraphQLDataFetcherSchema(this); + } + } +} diff --git a/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/data/GraphQLDataFilterTest.java b/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/data/GraphQLDataFilterTest.java new file mode 100644 index 00000000..3dce23cf --- /dev/null +++ b/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/data/GraphQLDataFilterTest.java @@ -0,0 +1,32 @@ +package com.tvd12.ezyhttp.server.graphql.test.data; + +import com.tvd12.ezyhttp.server.graphql.data.GraphQLDataFilter; +import com.tvd12.ezyhttp.server.graphql.data.GraphQLField; +import com.tvd12.test.assertion.Asserts; +import org.testng.annotations.Test; + +import java.util.Collections; +import java.util.Map; + +public class GraphQLDataFilterTest { + + private final GraphQLDataFilter instance = new GraphQLDataFilter(); + + @Test + public void filterWithNullDataTest() { + // given + GraphQLField childField = GraphQLField.builder() + .name("name") + .build(); + GraphQLField queryDefinition = GraphQLField.builder() + .name("user") + .addField(childField) + .build(); + + // when + Map result = instance.filter(null, queryDefinition); + + // then + Asserts.assertEquals(result, Collections.emptyMap(), false); + } +} diff --git a/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/fetcher/GraphQLDataFetcherManagerTest.java b/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/fetcher/GraphQLDataFetcherManagerTest.java index 59d05f95..483d1ca6 100644 --- a/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/fetcher/GraphQLDataFetcherManagerTest.java +++ b/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/fetcher/GraphQLDataFetcherManagerTest.java @@ -2,7 +2,6 @@ import com.tvd12.ezyfox.annotation.EzyManagement; import com.tvd12.ezyfox.annotation.EzyPayment; -import com.tvd12.ezyfox.util.EzyMapBuilder; import com.tvd12.ezyhttp.server.core.annotation.Authenticated; import com.tvd12.ezyhttp.server.core.handler.AuthenticatedController; import com.tvd12.ezyhttp.server.core.handler.ManageableController; @@ -20,6 +19,9 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; + +import static com.tvd12.ezyhttp.server.graphql.constants.GraphQLConstants.DEFAULT_QL_GROUP_NAME; public class GraphQLDataFetcherManagerTest { @@ -33,29 +35,136 @@ public void test() { .addDataFetcher(new Fetcher22()) .build(); + // then + assertFetcherManager(instance); + } + + @Test + public void addDataFetcherTest() { + // given + Fetcher1 fetcher1 = new Fetcher1(); + Fetcher11 fetcher11 = new Fetcher11(); + Fetcher2 fetcher2 = new Fetcher2(); + Fetcher22 fetcher22 = new Fetcher22(); + NoGroupFetcher noGroupFetcher = new NoGroupFetcher(); + GraphQLDataFetcherManager instance = GraphQLDataFetcherManager + .builder() + .build(); + + // when + instance.addDataFetcher(fetcher1.getQueryName(), fetcher1); + instance.addDataFetcher(fetcher11.getQueryName(), fetcher11); + instance.addDataFetcher(fetcher2.getQueryName(), fetcher2); + instance.addDataFetcher(fetcher22.getQueryName(), fetcher22); + instance.addDataFetcher(noGroupFetcher.getQueryName(), noGroupFetcher); + + // then + assertFetcherManager(instance); + Asserts.assertEquals( + instance.getDataFetcher(fetcher1.getQueryName()), + fetcher1 + ); + Asserts.assertEquals( + instance.getDataFetcher(noGroupFetcher.getQueryName()), + noGroupFetcher + ); + Asserts.assertEquals( + instance.getGroupNameByQueryName(noGroupFetcher.getQueryName()), + DEFAULT_QL_GROUP_NAME + ); + } + + @Test + public void getDataFetcherTest() { + // given + Fetcher1 fetcher1 = new Fetcher1(); + Fetcher2 fetcher2 = new Fetcher2(); + GraphQLDataFetcherManager instance = GraphQLDataFetcherManager + .builder() + .addDataFetcher(fetcher1) + .addDataFetcher(fetcher2) + .build(); + // when + GraphQLDataFetcher actualFetcher1 = instance.getDataFetcher( + fetcher1.getQueryName() + ); + GraphQLDataFetcher actualFetcher2 = instance.getDataFetcher( + fetcher2.getQueryName() + ); + GraphQLDataFetcher unknownFetcher = instance.getDataFetcher( + "unknown" + ); + + // then + Asserts.assertEquals(actualFetcher1, fetcher1); + Asserts.assertEquals(actualFetcher2, fetcher2); + Asserts.assertNull(unknownFetcher); + } + + @Test + public void getDataFetcherWithProviderTest() { + // given + Fetcher1 fetcher1 = new Fetcher1(); + Fetcher2 fetcher2 = new Fetcher2(); + AtomicInteger provideCount = new AtomicInteger(); + GraphQLDataFetcherManager instance = GraphQLDataFetcherManager + .builder() + .addDataFetcher(fetcher1) + .dataFetcherProvider(queryName -> { + provideCount.incrementAndGet(); + return fetcher2.getQueryName().equals(queryName) + ? fetcher2 + : null; + }) + .build(); + + // when + GraphQLDataFetcher existingFetcher = instance.getDataFetcher( + fetcher1.getQueryName() + ); + int provideCountAfterExistingFetcher = provideCount.get(); + GraphQLDataFetcher providedFetcher = instance.getDataFetcher( + fetcher2.getQueryName() + ); + GraphQLDataFetcher unknownFetcher = instance.getDataFetcher( + "unknown" + ); + + // then + Asserts.assertEquals(existingFetcher, fetcher1); + Asserts.assertEquals(provideCountAfterExistingFetcher, 0); + Asserts.assertEquals(providedFetcher, fetcher2); + Asserts.assertNull(unknownFetcher); + Asserts.assertEquals(provideCount.get(), 2); + } + + private void assertFetcherManager(GraphQLDataFetcherManager instance) { Map> queryNameByGroupName = instance .getQueryNameByGroupName(); Map> sortedQueryNameByGroupName = instance .getSortedQueryNameByGroupName(); - // then Asserts.assertEquals( - queryNameByGroupName, - EzyMapBuilder.mapBuilder() - .put("core1", new ArrayList<>(Sets.newHashSet("core1_fetcher1", "core1_fetcher11"))) - .put("core2", new ArrayList<>(Sets.newHashSet("core2_fetcher2", "core2_fetcher22"))) - .toMap(), + queryNameByGroupName.get("core1"), + new ArrayList<>(Sets.newHashSet("core1_fetcher1", "core1_fetcher11")), + false + ); + Asserts.assertEquals( + queryNameByGroupName.get("core2"), + new ArrayList<>(Sets.newHashSet("core2_fetcher2", "core2_fetcher22")), false ); Asserts.assertEquals( - sortedQueryNameByGroupName, - EzyMapBuilder.mapBuilder() - .put("core1", Arrays.asList("core1_fetcher1", "core1_fetcher11")) - .put("core2", Arrays.asList("core2_fetcher2", "core2_fetcher22")) - .toMap(), + sortedQueryNameByGroupName.get("core1"), + Arrays.asList("core1_fetcher1", "core1_fetcher11"), + false + ); + Asserts.assertEquals( + sortedQueryNameByGroupName.get("core2"), + Arrays.asList("core2_fetcher2", "core2_fetcher22"), false ); @@ -226,4 +335,25 @@ public boolean isManagement() { return false; } } + + private static class NoGroupFetcher implements GraphQLDataFetcher { + + @Override + public String getData( + RequestArguments arguments, + GraphQLQueryDefinition query + ) { + return null; + } + + @Override + public String getQueryName() { + return "no_group_fetcher"; + } + + @Override + public String getQueryGroupName() { + return ""; + } + } } diff --git a/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/fetcher/GraphQLDataFetcherTest.java b/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/fetcher/GraphQLDataFetcherTest.java index 6cd7271d..27553995 100644 --- a/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/fetcher/GraphQLDataFetcherTest.java +++ b/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/fetcher/GraphQLDataFetcherTest.java @@ -15,8 +15,7 @@ public void test() { // when // then - Asserts.assertNull(instance.getQueryScheme()); - Asserts.assertNull(instance.getResponseScheme()); + Asserts.assertNull(instance.getSchema()); } private static class ExGraphQLDataFetcher diff --git a/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/scheme/GraphQLDataFetcherSchemaTest.java b/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/scheme/GraphQLDataFetcherSchemaTest.java new file mode 100644 index 00000000..033f7625 --- /dev/null +++ b/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/scheme/GraphQLDataFetcherSchemaTest.java @@ -0,0 +1,41 @@ +package com.tvd12.ezyhttp.server.graphql.test.scheme; + +import com.tvd12.ezyhttp.server.graphql.scheme.GraphQLDataFetcherSchema; +import com.tvd12.ezyhttp.server.graphql.scheme.GraphQLDataSchema; +import com.tvd12.test.assertion.Asserts; +import com.tvd12.test.util.RandomUtil; +import org.testng.annotations.Test; + +import java.util.Collections; +import java.util.List; + +public class GraphQLDataFetcherSchemaTest { + + @Test + public void test() { + // given + List queryScheme = Collections.singletonList( + GraphQLDataSchema.builder() + .name(RandomUtil.randomShortAlphabetString()) + .type(RandomUtil.randomShortAlphabetString()) + .build() + ); + + GraphQLDataSchema getResponseScheme = GraphQLDataSchema.builder() + .name(RandomUtil.randomShortAlphabetString()) + .type(RandomUtil.randomShortAlphabetString()) + .build(); + + // when + GraphQLDataFetcherSchema instance = GraphQLDataFetcherSchema.builder() + .queryScheme(queryScheme) + .getResponseScheme(getResponseScheme) + .build(); + + // then + Asserts.assertEquals(instance.getQueryScheme(), queryScheme); + Asserts.assertEquals(instance.getGetResponseScheme(), getResponseScheme); + + System.out.println(instance); + } +} diff --git a/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/scheme/GraphQLSchemaTest.java b/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/scheme/GraphQLSchemaTest.java index c3848f44..e32bf0b6 100644 --- a/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/scheme/GraphQLSchemaTest.java +++ b/ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/scheme/GraphQLSchemaTest.java @@ -1,5 +1,6 @@ package com.tvd12.ezyhttp.server.graphql.test.scheme; +import com.tvd12.ezyhttp.server.graphql.query.GraphQLQueryDefinition; import com.tvd12.ezyhttp.server.graphql.scheme.GraphQLSchema; import com.tvd12.test.assertion.Asserts; import org.testng.annotations.Test; @@ -19,4 +20,43 @@ public void test() { // then Asserts.assertEquals(schema.getQueryDefinitions(), Collections.emptyList()); } + + @Test + public void addQueryDefinitionTest() { + // given + GraphQLQueryDefinition queryDefinition = GraphQLQueryDefinition.builder() + .name("getUser") + .build(); + + // when + GraphQLSchema schema = GraphQLSchema.builder() + .addQueryDefinition(queryDefinition) + .build(); + + // then + Asserts.assertEquals(schema.getQueryDefinitions().size(), 1); + Asserts.assertEquals(schema.getQueryDefinitions().get(0).getName(), "getUser"); + } + + @Test + public void addMultipleQueryDefinitionsTest() { + // given + GraphQLQueryDefinition queryDefinition1 = GraphQLQueryDefinition.builder() + .name("getUser") + .build(); + GraphQLQueryDefinition queryDefinition2 = GraphQLQueryDefinition.builder() + .name("getProduct") + .build(); + + // when + GraphQLSchema schema = GraphQLSchema.builder() + .addQueryDefinition(queryDefinition1) + .addQueryDefinition(queryDefinition2) + .build(); + + // then + Asserts.assertEquals(schema.getQueryDefinitions().size(), 2); + Asserts.assertEquals(schema.getQueryDefinitions().get(0).getName(), "getUser"); + Asserts.assertEquals(schema.getQueryDefinitions().get(1).getName(), "getProduct"); + } } diff --git a/ezyhttp-server-jetty/pom.xml b/ezyhttp-server-jetty/pom.xml index 2991b165..98be4033 100644 --- a/ezyhttp-server-jetty/pom.xml +++ b/ezyhttp-server-jetty/pom.xml @@ -5,7 +5,7 @@ com.tvd12 ezyhttp - 1.5.2 + 1.5.3 ezyhttp-server-jetty diff --git a/ezyhttp-server-management/pom.xml b/ezyhttp-server-management/pom.xml index 2ccdecef..1ea72835 100644 --- a/ezyhttp-server-management/pom.xml +++ b/ezyhttp-server-management/pom.xml @@ -6,7 +6,7 @@ com.tvd12 ezyhttp - 1.5.2 + 1.5.3 ezyhttp-server-management ezyhttp-server-management diff --git a/ezyhttp-server-thymeleaf/pom.xml b/ezyhttp-server-thymeleaf/pom.xml index 222cfea7..9c5ea43c 100644 --- a/ezyhttp-server-thymeleaf/pom.xml +++ b/ezyhttp-server-thymeleaf/pom.xml @@ -6,7 +6,7 @@ com.tvd12 ezyhttp - 1.5.2 + 1.5.3 ezyhttp-server-thymeleaf ezyhttp-server-thymeleaf diff --git a/ezyhttp-server-tomcat/pom.xml b/ezyhttp-server-tomcat/pom.xml index 542a1fa1..a6199bbf 100644 --- a/ezyhttp-server-tomcat/pom.xml +++ b/ezyhttp-server-tomcat/pom.xml @@ -5,7 +5,7 @@ com.tvd12 ezyhttp - 1.5.2 + 1.5.3 ezyhttp-server-tomcat diff --git a/pom.xml b/pom.xml index 8489de7c..84c94995 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 1.0.7 ezyhttp - 1.5.2 + 1.5.3 pom ezyhttp