diff --git a/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/KakaopayFilter.java b/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/KakaopayFilter.java new file mode 100644 index 0000000..cfc2e30 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/KakaopayFilter.java @@ -0,0 +1,45 @@ +package com.eactive.eai.custom.adapter.http.dynamic.filter; + +import java.util.Properties; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.eactive.eai.adapter.http.dynamic.filter.FilterException; +import com.eactive.eai.adapter.http.dynamic.filter.HttpAdapterFilter; +import com.eactive.eai.common.util.JacksonUtil; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * 카카오뱅크 암복호화에 맟추어 커스텀 필요 + */ +public class KakaopayFilter implements HttpAdapterFilter { + + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + @Override + public Object doPreFilter(String adptGrpName, String adptName, Object message, Properties prop, + HttpServletRequest request, HttpServletResponse response) throws Exception { + + JsonNode rootNode = JacksonUtil.readTree(message, OBJECT_MAPPER); + + // term_agreements[0].is_agreed 값이 true 인지 확인 + boolean firstAgreed = JacksonUtil.getBoolean(rootNode, "term_agreements[0].is_agreed", false); + + if (!firstAgreed) { + throw new FilterException("EB000003", "금리한도조회실패 - 고객 요청으로 인한 CB 조회 실패", 200); + } + + return message; + + } + + @Override + public Object doPostFilter(String adptGrpName, String adptName, Object resultMessage, Properties prop, + HttpServletRequest request, HttpServletResponse response) throws Exception { + return resultMessage; + } + +} + diff --git a/src/test/java/com/eactive/eai/custom/adapter/http/dynamic/filter/KakaopayFilterTest.java b/src/test/java/com/eactive/eai/custom/adapter/http/dynamic/filter/KakaopayFilterTest.java new file mode 100644 index 0000000..6360ee6 --- /dev/null +++ b/src/test/java/com/eactive/eai/custom/adapter/http/dynamic/filter/KakaopayFilterTest.java @@ -0,0 +1,108 @@ +package com.eactive.eai.custom.adapter.http.dynamic.filter; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.eactive.eai.adapter.http.dynamic.filter.FilterException; + +class KakaopayFilterTest { + + private KakaopayFilter filter; + + @BeforeEach + void setUp() { + filter = new KakaopayFilter(); + } + + // ----------------------------------------------------------------------- + // doPreFilter + // ----------------------------------------------------------------------- + + @Test + void preFilter_firstAgreedTrue_returnsMessage() throws Exception { + String message = "{\"term_agreements\":[{\"is_agreed\":true}]}"; + + Object result = filter.doPreFilter(null, null, message, null, null, null); + + assertSame(message, result); + } + + @Test + void preFilter_firstAgreedFalse_throwsFilterException() throws Exception { + String message = "{\"term_agreements\":[{\"is_agreed\":false}]}"; + + FilterException ex = assertThrows(FilterException.class, + () -> filter.doPreFilter(null, null, message, null, null, null)); + assertEquals("EB000003", ex.getMessage()); + assertEquals(200, ex.getStatus()); + } + + @Test + void preFilter_isAgreedFieldMissing_throwsFilterException() { + // is_agreed 필드 없음 → getBoolean 기본값 false → 예외 + String message = "{\"term_agreements\":[{}]}"; + + assertThrows(FilterException.class, + () -> filter.doPreFilter(null, null, message, null, null, null)); + } + + @Test + void preFilter_termAgreementsEmpty_throwsFilterException() { + // 배열이 비어있어 [0] 접근 불가 → getBoolean 기본값 false → 예외 + String message = "{\"term_agreements\":[]}"; + + assertThrows(FilterException.class, + () -> filter.doPreFilter(null, null, message, null, null, null)); + } + + @Test + void preFilter_termAgreementsMissing_throwsFilterException() { + // term_agreements 필드 자체 없음 → getBoolean 기본값 false → 예외 + String message = "{}"; + + assertThrows(FilterException.class, + () -> filter.doPreFilter(null, null, message, null, null, null)); + } + + @Test + void preFilter_multipleEntries_firstAgreedTrue_returnsMessage() throws Exception { + // 첫 번째 true, 두 번째 false → 통과 + String message = "{\"term_agreements\":[" + + "{\"is_agreed\":true}," + + "{\"is_agreed\":false}" + + "]}"; + + Object result = filter.doPreFilter(null, null, message, null, null, null); + + assertSame(message, result); + } + + @Test + void preFilter_multipleEntries_firstAgreedFalse_throwsFilterException() { + // 첫 번째 false, 두 번째 true → 예외 + String message = "{\"term_agreements\":[" + + "{\"is_agreed\":false}," + + "{\"is_agreed\":true}" + + "]}"; + + assertThrows(FilterException.class, + () -> filter.doPreFilter(null, null, message, null, null, null)); + } + + // ----------------------------------------------------------------------- + // doPostFilter + // ----------------------------------------------------------------------- + + @Test + void postFilter_alwaysReturnsResultMessage() throws Exception { + String resultMessage = "{\"result\":\"ok\"}"; + + Object result = filter.doPostFilter(null, null, resultMessage, null, null, null); + + assertSame(resultMessage, result); + } +}