From 7ac07be35c6fd9551abe8f4227c50dca32536983 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=98=84=EC=84=B1=ED=95=84?= Date: Tue, 22 Aug 2023 15:41:22 +0900 Subject: [PATCH] =?UTF-8?q?strategy=20pattern=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/condition/ConditionMatcher.java | 10 +++ .../api/condition/HeaderMatcher.java | 13 ++++ .../api/condition/JsonPathMatcher.java | 20 ++++++ .../api/condition/PathMatcher.java | 13 ++++ .../api/condition/QueryMatcher.java | 13 ++++ .../api/controller/MockApiController.java | 64 ++++++------------- 6 files changed, 88 insertions(+), 45 deletions(-) create mode 100644 src/main/java/com/eactive/httpmockserver/api/condition/ConditionMatcher.java create mode 100644 src/main/java/com/eactive/httpmockserver/api/condition/HeaderMatcher.java create mode 100644 src/main/java/com/eactive/httpmockserver/api/condition/JsonPathMatcher.java create mode 100644 src/main/java/com/eactive/httpmockserver/api/condition/PathMatcher.java create mode 100644 src/main/java/com/eactive/httpmockserver/api/condition/QueryMatcher.java diff --git a/src/main/java/com/eactive/httpmockserver/api/condition/ConditionMatcher.java b/src/main/java/com/eactive/httpmockserver/api/condition/ConditionMatcher.java new file mode 100644 index 0000000..52fa579 --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/api/condition/ConditionMatcher.java @@ -0,0 +1,10 @@ +package com.eactive.httpmockserver.api.condition; + +import com.eactive.httpmockserver.api.dto.MockRequest; +import com.eactive.httpmockserver.api.entity.MockCondition; + +import java.util.Map; + +public interface ConditionMatcher { + boolean matches(MockCondition condition, MockRequest request, Map pathVariables); +} \ No newline at end of file diff --git a/src/main/java/com/eactive/httpmockserver/api/condition/HeaderMatcher.java b/src/main/java/com/eactive/httpmockserver/api/condition/HeaderMatcher.java new file mode 100644 index 0000000..f988b0f --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/api/condition/HeaderMatcher.java @@ -0,0 +1,13 @@ +package com.eactive.httpmockserver.api.condition; + +import com.eactive.httpmockserver.api.dto.MockRequest; +import com.eactive.httpmockserver.api.entity.MockCondition; + +import java.util.Map; + +public class HeaderMatcher implements ConditionMatcher { + @Override + public boolean matches(MockCondition condition, MockRequest request, Map pathVariables) { + return condition.getValue().equals(request.getHeader(condition.getKey())); + } +} diff --git a/src/main/java/com/eactive/httpmockserver/api/condition/JsonPathMatcher.java b/src/main/java/com/eactive/httpmockserver/api/condition/JsonPathMatcher.java new file mode 100644 index 0000000..35f021b --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/api/condition/JsonPathMatcher.java @@ -0,0 +1,20 @@ +package com.eactive.httpmockserver.api.condition; + +import com.eactive.httpmockserver.api.dto.MockRequest; +import com.eactive.httpmockserver.api.entity.MockCondition; +import com.jayway.jsonpath.JsonPath; +import com.jayway.jsonpath.PathNotFoundException; + +import java.util.Map; + +public class JsonPathMatcher implements ConditionMatcher { + @Override + public boolean matches(MockCondition condition, MockRequest request, Map pathVariables) { + try { + Object value = JsonPath.read(request.getBody(), condition.getKey()); + return value.toString().equals(condition.getValue()); + } catch (PathNotFoundException e) { + return false; + } + } +} diff --git a/src/main/java/com/eactive/httpmockserver/api/condition/PathMatcher.java b/src/main/java/com/eactive/httpmockserver/api/condition/PathMatcher.java new file mode 100644 index 0000000..0207da1 --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/api/condition/PathMatcher.java @@ -0,0 +1,13 @@ +package com.eactive.httpmockserver.api.condition; + +import com.eactive.httpmockserver.api.dto.MockRequest; +import com.eactive.httpmockserver.api.entity.MockCondition; + +import java.util.Map; + +public class PathMatcher implements ConditionMatcher { + @Override + public boolean matches(MockCondition condition, MockRequest request, Map pathVariables) { + return condition.getValue().equals(pathVariables.get(condition.getKey())); + } +} diff --git a/src/main/java/com/eactive/httpmockserver/api/condition/QueryMatcher.java b/src/main/java/com/eactive/httpmockserver/api/condition/QueryMatcher.java new file mode 100644 index 0000000..91103db --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/api/condition/QueryMatcher.java @@ -0,0 +1,13 @@ +package com.eactive.httpmockserver.api.condition; + +import com.eactive.httpmockserver.api.dto.MockRequest; +import com.eactive.httpmockserver.api.entity.MockCondition; + +import java.util.Map; + +public class QueryMatcher implements ConditionMatcher { + @Override + public boolean matches(MockCondition condition, MockRequest request, Map pathVariables) { + return condition.getValue().equals(request.getParam(condition.getKey())); + } +} diff --git a/src/main/java/com/eactive/httpmockserver/api/controller/MockApiController.java b/src/main/java/com/eactive/httpmockserver/api/controller/MockApiController.java index aac29c5..ed39b9d 100644 --- a/src/main/java/com/eactive/httpmockserver/api/controller/MockApiController.java +++ b/src/main/java/com/eactive/httpmockserver/api/controller/MockApiController.java @@ -1,15 +1,13 @@ package com.eactive.httpmockserver.api.controller; +import com.eactive.httpmockserver.api.condition.*; import com.eactive.httpmockserver.api.dto.MockRequest; import com.eactive.httpmockserver.api.entity.MockCondition; import com.eactive.httpmockserver.api.entity.MockResponse; import com.eactive.httpmockserver.api.entity.MockRoute; import com.eactive.httpmockserver.api.service.MockRouteService; -import com.jayway.jsonpath.JsonPath; -import com.jayway.jsonpath.PathNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -19,16 +17,26 @@ import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @RestController public class MockApiController { - @Autowired - private MockRouteService mockRouteService; + private final MockRouteService mockRouteService; + Map matchers; + + public MockApiController(MockRouteService mockRouteService) { + this.mockRouteService = mockRouteService; + this.matchers = new ConcurrentHashMap<>(); + matchers.put("query", new QueryMatcher()); + matchers.put("path", new PathMatcher()); + matchers.put("header", new HeaderMatcher()); + matchers.put("jsonpath", new JsonPathMatcher()); + + } //logger @@ -99,54 +107,20 @@ public class MockApiController { return null; } + private boolean isRequestMatching(List conditions, MockRequest request, Map pathVariables) { if (conditions == null) { return true; } - List results = new ArrayList<>(); for (MockCondition condition : conditions) { - switch (condition.getType().toLowerCase()) { - case "query": - results.add(isQueryMatching(condition, request)); - break; - case "header": - results.add(isHeaderMatching(condition, request)); - break; - case "path": - results.add(isPathMatching(condition, pathVariables)); - break; - case "jsonpath": - results.add(isJsonPathMatching(condition, request)); - break; - default: - break; + ConditionMatcher matcher = matchers.get(condition.getType().toLowerCase()); + if (matcher != null && !matcher.matches(condition, request, pathVariables)) { + return false; } } - return !results.contains(false); + return true; } - private boolean isQueryMatching(MockCondition condition, MockRequest request) { - return condition.getValue().equals(request.getParam(condition.getKey())); - } - - private boolean isHeaderMatching(MockCondition condition, MockRequest request) { - return condition.getValue().equals(request.getHeader(condition.getKey())); - } - - private boolean isPathMatching(MockCondition condition, Map pathVariables) { - return condition.getValue().equals(pathVariables.get(condition.getKey())); - } - - private boolean isJsonPathMatching(MockCondition condition, MockRequest request) { - try { - Object value = JsonPath.read(request.getBody(), condition.getKey()); - return value.toString().equals(condition.getValue()); - } catch (PathNotFoundException e) { - return false; - } - } - - }