From dba1bd5e650076458cc924d2a8883df611be4513 Mon Sep 17 00:00:00 2001 From: pjhcsols Date: Sun, 6 Oct 2024 19:32:30 +0900 Subject: [PATCH] =?UTF-8?q?#27=20Feat:=20IdentityCheckTest=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web3/api/identity/AccessTokenTest.java | 16 +- .../test/java/web3/api/identity/GetToken.java | 102 ++++++++++++ .../java/web3/api/identity/GetTokenTest.java | 145 ++++++++++++++++++ .../api/identity/IdentityCheckMockTest.java | 68 +++----- .../web3/api/identity/IdentityCheckTest.java | 129 ++++++++-------- 5 files changed, 344 insertions(+), 116 deletions(-) create mode 100644 web3-credential-server/src/test/java/web3/api/identity/GetToken.java create mode 100644 web3-credential-server/src/test/java/web3/api/identity/GetTokenTest.java diff --git a/web3-credential-server/src/test/java/web3/api/identity/AccessTokenTest.java b/web3-credential-server/src/test/java/web3/api/identity/AccessTokenTest.java index f488e23..1cfed03 100644 --- a/web3-credential-server/src/test/java/web3/api/identity/AccessTokenTest.java +++ b/web3-credential-server/src/test/java/web3/api/identity/AccessTokenTest.java @@ -3,7 +3,11 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.web.client.RestTemplate; import java.io.BufferedReader; import java.io.InputStreamReader; @@ -15,12 +19,16 @@ import static org.assertj.core.api.Assertions.assertThat; -@SpringBootTest +//@SpringBootTest +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class AccessTokenTest { + @Autowired + private RestTemplate restTemplate; + private static final String TOKEN_URL = "https://oauth.codef.io/oauth/token"; - private static final String CLIENT_ID = "9f515c3f-8df3-41b7-9da1-e08192131b3d"; - private static final String CLIENT_SECRET = "d0c5a8b8-2858-4059-acff-289f42892f47"; + private static final String CLIENT_ID = "86640213-3b83-461a-97ab-2491d68a2052"; + private static final String CLIENT_SECRET = "8721d0b3-37ea-4484-8d65-6418a61fd1a1"; @Test void shouldPublishAccessTokenSuccessfully() throws Exception { @@ -28,7 +36,7 @@ void shouldPublishAccessTokenSuccessfully() throws Exception { assertThat(tokenResponse).isNotNull(); assertThat(tokenResponse.get("access_token")).isNotNull(); - + System.out.println("Access Token: " + tokenResponse.get("access_token")); } diff --git a/web3-credential-server/src/test/java/web3/api/identity/GetToken.java b/web3-credential-server/src/test/java/web3/api/identity/GetToken.java new file mode 100644 index 0000000..3330d4f --- /dev/null +++ b/web3-credential-server/src/test/java/web3/api/identity/GetToken.java @@ -0,0 +1,102 @@ +package web3.api.identity; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLDecoder; +import java.util.Base64; +import java.util.HashMap; + +public class GetToken { + + private static final String OAUTH_DOMAIN = "https://oauth.codef.io"; + private static final String GET_TOKEN = "/oauth/token"; + + public static void main(String[] args) { + String clientId = "86640213-3b83-461a-97ab-2491d68a2052"; + String clientSecret = "8721d0b3-37ea-4484-8d65-6418a61fd1a1"; + + // 토큰 발급 + HashMap tokenMap = publishToken(clientId, clientSecret); + + if (tokenMap != null && tokenMap.containsKey("access_token")) { + // 발급된 액세스 토큰 + String accessToken = tokenMap.get("access_token"); + System.out.println("Access Token: " + accessToken); + } else { + System.out.println("Failed to get access token"); + } + } + + public static String getAccessToken(String clientId, String clientSecret) { + HashMap tokenMap = publishToken(clientId, clientSecret); + if (tokenMap != null && tokenMap.containsKey("access_token")) { + return tokenMap.get("access_token"); + } else { + throw new RuntimeException("Failed to get access token"); + } + } + + public static HashMap publishToken(String clientId, String clientSecret) { + BufferedReader br = null; + try { + URL url = new URL(OAUTH_DOMAIN + GET_TOKEN); + String params = "grant_type=client_credentials&scope=read"; + + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("POST"); + con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + + String auth = clientId + ":" + clientSecret; + byte[] authEncBytes = Base64.getEncoder().encode(auth.getBytes()); + String authStringEnc = new String(authEncBytes); + String authHeader = "Basic " + authStringEnc; + con.setRequestProperty("Authorization", authHeader); + con.setDoInput(true); + con.setDoOutput(true); + + OutputStream os = con.getOutputStream(); + os.write(params.getBytes()); + os.flush(); + os.close(); + + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + br = new BufferedReader(new InputStreamReader(con.getInputStream())); + } else { + return null; + } + + String inputLine; + StringBuffer responseStr = new StringBuffer(); + while ((inputLine = br.readLine()) != null) { + responseStr.append(inputLine); + } + br.close(); + + ObjectMapper mapper = new ObjectMapper(); + HashMap tokenMap = mapper.readValue(URLDecoder.decode(responseStr.toString(), "UTF-8"), + new TypeReference>() { + }); + + return tokenMap; + } catch (Exception e) { + e.printStackTrace(); + return null; + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException e) { + // Ignored + } + } + } + } +} \ No newline at end of file diff --git a/web3-credential-server/src/test/java/web3/api/identity/GetTokenTest.java b/web3-credential-server/src/test/java/web3/api/identity/GetTokenTest.java new file mode 100644 index 0000000..8192eea --- /dev/null +++ b/web3-credential-server/src/test/java/web3/api/identity/GetTokenTest.java @@ -0,0 +1,145 @@ +package web3.api.identity; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; + +import java.util.Base64; +import java.util.HashMap; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.when; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class GetTokenTest { + + private static final String TOKEN_URL = "https://oauth.codef.io/oauth/token"; + private static final String CLIENT_ID = "86640213-3b83-461a-97ab-2491d68a2052"; + private static final String CLIENT_SECRET = "8721d0b3-37ea-4484-8d65-6418a61fd1a1"; + + // RestTemplate을 Mocking + @MockBean + private RestTemplate restTemplate; + + @Test + public void testPublishToken_Success() { + try { + // 가짜 응답 설정 (JSON 형식의 Access Token 반환) + String mockResponse = "{ \"access_token\": \"mock_access_token\", \"token_type\": \"bearer\" }"; + + // ResponseEntity 생성 (모킹된 응답) + ResponseEntity mockResponseEntity = new ResponseEntity<>(mockResponse, HttpStatus.OK); + + // RestTemplate.exchange가 호출될 때 mockResponseEntity를 반환하도록 설정 + when(restTemplate.exchange( + anyString(), + eq(HttpMethod.POST), + any(HttpEntity.class), + eq(String.class))) + .thenReturn(mockResponseEntity); + + // 실제 토큰 발급 함수 호출 + HashMap tokenMap = publishToken(CLIENT_ID, CLIENT_SECRET); + + // 응답 검증 + assertThat(tokenMap).isNotNull(); + assertThat(tokenMap.containsKey("access_token")).isTrue(); + assertThat(tokenMap.get("access_token")).isEqualTo("mock_access_token"); + + System.out.println("Access Token: " + tokenMap.get("access_token")); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } + } + + /** + * RestTemplate을 사용하여 토큰을 발급받는 메서드 + * + * @param clientId OAuth2 Client ID + * @param clientSecret OAuth2 Client Secret + * @return 토큰 응답 데이터가 포함된 HashMap + */ + public HashMap publishToken(String clientId, String clientSecret) { + try { + // Base64 인코딩된 인증 헤더 생성 + String auth = clientId + ":" + clientSecret; + String authHeader = "Basic " + Base64.getEncoder().encodeToString(auth.getBytes()); + + // HTTP 요청 헤더 설정 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + headers.set("Authorization", authHeader); + + // 요청 바디 설정 (grant_type 설정) + String body = "grant_type=client_credentials&scope=read"; + + // HttpEntity를 사용하여 요청 헤더 및 바디를 설정 + HttpEntity requestEntity = new HttpEntity<>(body, headers); + + // Mock된 RestTemplate 사용 (실제 API 호출 X) + ResponseEntity response = restTemplate.exchange( + TOKEN_URL, + HttpMethod.POST, + requestEntity, + String.class + ); + + // 응답 본문 출력 및 확인 + String responseBody = response.getBody(); + System.out.println("Response Body: " + responseBody); + + // 응답 본문을 JSON 형태로 파싱하여 HashMap으로 반환 + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.readValue(responseBody, new TypeReference>() {}); + } catch (Exception e) { + System.err.println("Exception occurred: " + e.getMessage()); + return null; + } + } +} +// 아래 코드는 Spring 환경 아니어도 독립적으로 실행 가능한 유닛 테스트 +// package web3.api.identity; + +// import org.junit.jupiter.api.Test; + +// import java.util.HashMap; + +// import static org.assertj.core.api.Assertions.assertThat; +// import static org.assertj.core.api.Assertions.fail; + +// public class GetTokenTest { + +// private String clientId = "86640213-3b83-461a-97ab-2491d68a2052"; +// private String clientSecret = "8721d0b3-37ea-4484-8d65-6418a61fd1a1"; +// private String invalidClientId = "invalid-client-id"; +// private String invalidClientSecret = "invalid-client-secret"; + +// @Test +// public void testPublishToken_Success() { +// try { +// HashMap tokenMap = GetToken.publishToken(clientId, clientSecret); +// assertThat(tokenMap).isNotNull(); +// assertThat(tokenMap.containsKey("access_token")).isTrue(); +// System.out.println("Access Token: " + tokenMap.get("access_token")); +// } catch (Exception e) { +// fail("Exception occurred: " + e.getMessage()); +// } +// } + +// @Test +// public void testPublishToken_Failure() { +// try { +// HashMap tokenMap = GetToken.publishToken(invalidClientId, invalidClientSecret); +// assertThat(tokenMap).isNull(); +// } catch (Exception e) { +// // Expected exception caught, test passed. +// assertThat(e.getMessage()).contains("Failed to get access token"); +// } +// } +// } \ No newline at end of file diff --git a/web3-credential-server/src/test/java/web3/api/identity/IdentityCheckMockTest.java b/web3-credential-server/src/test/java/web3/api/identity/IdentityCheckMockTest.java index f466fc7..962917f 100644 --- a/web3-credential-server/src/test/java/web3/api/identity/IdentityCheckMockTest.java +++ b/web3-credential-server/src/test/java/web3/api/identity/IdentityCheckMockTest.java @@ -1,20 +1,17 @@ package web3.api.identity; +import com.fasterxml.jackson.core.util.RequestPayload; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.info.InfoProperties; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Bean; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.web.client.RestTemplate; @@ -24,24 +21,20 @@ import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus; import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess; -@SpringBootTest -@ActiveProfiles("test") +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class IdentityCheckMockTest { - @Autowired - private RestTemplate restTemplate; - @MockBean - private InfoProperties identityProperties; + private RestTemplate restTemplate; - @Autowired private MockRestServiceServer mockServer; - private final ObjectMapper objectMapper = new ObjectMapper(); + @Autowired + private ObjectMapper objectMapper; @BeforeEach public void setup() { - mockServer.reset(); + this.mockServer = MockRestServiceServer.createServer(restTemplate); } @Test @@ -54,21 +47,10 @@ void testIdentityCardCheckStatusSuccess() throws Exception { String userName = "홍길동"; String issueDate = "20190101"; - // JSON Request Payload - String requestBody = "{\n" + - " \"organization\": \"0002\",\n" + - " \"loginType\": \"0\",\n" + - " \"certType\": \"1\",\n" + - " \"certFile\": \"" + certFileBase64 + "\",\n" + - " \"keyFile\": \"" + keyFileBase64 + "\",\n" + - " \"certPassword\": \"" + certPassword + "\",\n" + - " \"identity\": \"" + identity + "\",\n" + - " \"userName\": \"" + userName + "\",\n" + - " \"issueDate\": \"" + issueDate + "\",\n" + - " \"identityEncYn\": \"N\"\n" + - "}"; + // Create JSON Request Payload using ObjectMapper + String requestBody = objectMapper.writeValueAsString(new RequestPayload("0002")); - // 모의 응답 설정 + // Mock success response String successResponse = "{\n" + " \"resUserNm\": \"" + userName + "\",\n" + " \"resUserIdentiyNo\": \"910101-1234***\",\n" + @@ -80,22 +62,22 @@ void testIdentityCardCheckStatusSuccess() throws Exception { .andExpect(content().json(requestBody)) .andRespond(withSuccess(successResponse, MediaType.APPLICATION_JSON)); - // 실제 요청 수행 - String response = requestIdentityCheck(apiUrl, requestBody); + // Actual request execution + String accessToken = "YOUR_ACCESS_TOKEN"; // Insert actual access token here + String response = requestIdentityCheck(apiUrl, requestBody, accessToken); - // 응답 검증 + // Response verification JsonNode jsonResponse = objectMapper.readTree(response); assertThat(jsonResponse.get("resUserNm").asText()).isEqualTo(userName); assertThat(jsonResponse.get("resAuthenticity").asText()).isEqualTo("1"); assertThat(jsonResponse.get("resAuthenticityDesc").asText()).isEqualTo("주민등록번호 진위확인 성공"); } - @Test void testIdentityCardCheckStatusFailure() { String apiUrl = "https://development.codef.io/v1/kr/public/mw/identity-card/check-status"; String certFileBase64 = "INVALID_CERT_FILE"; String keyFileBase64 = "INVALID_KEY_FILE"; - String certPassword = "INVALID_PASSWORD"; + String certPassword = "INALID_PASSWORD"; String identity = "9101011234123"; String userName = "홍길동"; String issueDate = "20190101"; @@ -114,39 +96,27 @@ void testIdentityCardCheckStatusFailure() { " \"identityEncYn\": \"N\"\n" + "}"; - // 모의 응답 설정: 400 BAD REQUEST + // Mock response: 400 BAD REQUEST mockServer.expect(requestTo(apiUrl)) .andExpect(content().json(requestBody)) .andRespond(withStatus(HttpStatus.BAD_REQUEST)); try { - requestIdentityCheck(apiUrl, requestBody); + String accessToken = "YOUR_ACCESS_TOKEN"; // Insert actual access token here + requestIdentityCheck(apiUrl, requestBody, accessToken); } catch (RuntimeException e) { assertThat(e.getMessage()).contains("Failed to request identity card check status"); } } - private String requestIdentityCheck(String url, String body) { + private String requestIdentityCheck(String url, String body, String accessToken) { try { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); + headers.setBearerAuth(accessToken); // Set the Bearer token in the headers return restTemplate.postForObject(url, new HttpEntity<>(body, headers), String.class); } catch (Exception e) { throw new RuntimeException("Failed to request identity card check status", e); } } - - @TestConfiguration - static class TestConfig { - - @Bean - public RestTemplate restTemplate() { - return new RestTemplate(); - } - - @Bean - public MockRestServiceServer mockRestServiceServer(RestTemplate restTemplate) { - return MockRestServiceServer.createServer(restTemplate); - } - } } \ No newline at end of file diff --git a/web3-credential-server/src/test/java/web3/api/identity/IdentityCheckTest.java b/web3-credential-server/src/test/java/web3/api/identity/IdentityCheckTest.java index e6b2332..f53c027 100644 --- a/web3-credential-server/src/test/java/web3/api/identity/IdentityCheckTest.java +++ b/web3-credential-server/src/test/java/web3/api/identity/IdentityCheckTest.java @@ -3,10 +3,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.*; -import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.test.web.client.MockRestServiceServer; +import org.springframework.test.web.client.match.MockRestRequestMatchers; +import org.springframework.test.web.client.response.MockRestResponseCreators; import org.springframework.web.client.RestTemplate; import java.net.URLDecoder; @@ -15,94 +19,93 @@ import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; +import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; +import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess; +import static org.springframework.http.HttpMethod.POST; -@SpringBootTest +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class IdentityCheckTest { - @Autowired + @MockBean private RestTemplate restTemplate; private static final String API_URL = "https://development.codef.io/v1/kr/public/mw/identity-card/check-status"; - private static String accessToken; // Access Token을 저장할 변수 + private static String accessToken; + + private MockRestServiceServer mockServer; @BeforeAll - static void setup() throws Exception { - // AccessTokenTest 클래스를 이용하여 Access Token을 발급받음 - HashMap tokenResponse = AccessTokenTest.publishToken( - "9f515c3f-8df3-41b7-9da1-e08192131b3d", - "d0c5a8b8-2858-4059-acff-289f42892f47" - ); + static void setup() { + accessToken = "mock_access_token"; // Mock access token + } - // 발급받은 토큰을 accessToken 변수에 저장 - if (tokenResponse != null && tokenResponse.get("access_token") != null) { - accessToken = tokenResponse.get("access_token"); - } else { - throw new RuntimeException("Failed to obtain access token"); - } + @Autowired + public void setUpMockServer(RestTemplate restTemplate) { + // Initialize MockRestServiceServer + mockServer = MockRestServiceServer.createServer(restTemplate); } @Test void shouldCheckIdentityCardStatusSuccessfully() throws Exception { - // API 요청 페이로드 준비 + // Mock API response setup + String mockApiResponse = "{ \"result\": \"success\", \"data\": { \"resUserNm\": \"홍길동\", \"resUserIdentiyNo\": \"910101-1234***\", \"resAuthenticity\": \"1\", \"resAuthenticityDesc\": \"주민등록번호 진위확인 성공\" } }"; + mockServer.expect(requestTo(API_URL)) + .andExpect(method(POST)) // Correctly specify the HTTP method + .andRespond(withSuccess(mockApiResponse, MediaType.APPLICATION_JSON)); + + // API request payload preparation Map requestBody = new HashMap<>(); requestBody.put("organization", "0002"); requestBody.put("loginType", "0"); requestBody.put("certType", "1"); - requestBody.put("certFile", "BASE64_ENCODED_CERT_DER"); // 실제 Base64 인코딩된 인증서 der 문자열로 대체 - requestBody.put("keyFile", "BASE64_ENCODED_KEY_FILE"); // 실제 Base64 인코딩된 키 파일 문자열로 대체 - requestBody.put("certPassword", "ENCRYPTED_PASSWORD"); // 실제 RSA 암호화된 비밀번호로 대체 - requestBody.put("loginTypeLevel", "1"); - requestBody.put("telecom", ""); - requestBody.put("phoneNo", "01012341234"); + requestBody.put("certFile", "BASE64_ENCODED_CERT_DER"); // Replace with actual Base64 encoded cert + requestBody.put("keyFile", "BASE64_ENCODED_KEY_FILE"); // Replace with actual Base64 encoded key + requestBody.put("certPassword", "ENCRYPTED_PASSWORD"); // Replace with actual encrypted password requestBody.put("loginUserName", "홍길동"); requestBody.put("loginIdentity", "9101011234123"); - requestBody.put("loginBirthDate", ""); - requestBody.put("birthDate", ""); - requestBody.put("identity", "9101011234123"); - requestBody.put("userName", "홍길동"); requestBody.put("issueDate", "20190101"); - requestBody.put("identityEncYn", ""); + requestBody.put("identityEncYn", "N"); - // HTTP 요청 헤더 설정 + // HTTP request header setup HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); - - // 발급받은 Access Token을 Authorization 헤더에 설정 headers.setBearerAuth(accessToken); - // HttpEntity 객체 생성 (요청 바디와 헤더 포함) + // HttpEntity object creation (including request body and headers) HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); - try { - // API 엔드포인트로 POST 요청 전송 - ResponseEntity response = restTemplate.exchange( - API_URL, - HttpMethod.POST, - requestEntity, - String.class - ); - - // URL 디코딩 수행 후 응답 바디 출력 - String decodedBody = URLDecoder.decode(response.getBody(), StandardCharsets.UTF_8.name()); - System.out.println("Decoded Response Body: " + decodedBody); - - // 응답 검증 - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(decodedBody).isNotNull(); - - // URL 디코딩된 응답 파싱 (선택 사항: 특정 필드를 확인하기 위해) - ObjectMapper objectMapper = new ObjectMapper(); - Map responseBody = objectMapper.readValue(decodedBody, Map.class); - - // 특정 응답 필드에 대한 검증 추가 - assertThat(responseBody).containsKey("result"); - assertThat(responseBody).containsKey("data"); - - } catch (HttpStatusCodeException e) { - // HTTP 상태 코드 에러를 처리하기 위해 예외 로그 출력 - System.err.println("HTTP Status Code: " + e.getStatusCode()); - System.err.println("Response Body: " + e.getResponseBodyAsString()); - throw e; - } + // Make API call and receive response + ResponseEntity response = restTemplate.exchange( + API_URL, + POST, + requestEntity, + String.class + ); + + // Assert the response is not null and has the expected status code + assertThat(response).isNotNull(); // Ensure response is not null + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + + // Check the mock server for expected behavior + mockServer.verify(); // Verify that the request was received by the mock server + + // Ensure the response body is not null and decode it + String responseBody = response.getBody(); + assertThat(responseBody).isNotNull(); // Ensure response body is not null + + // URL decode the response body + String decodedBody = URLDecoder.decode(responseBody, StandardCharsets.UTF_8.name()); + System.out.println("Decoded Response Body: " + decodedBody); + + // URL decoded response parsing + ObjectMapper objectMapper = new ObjectMapper(); + Map responseMap = objectMapper.readValue(decodedBody, Map.class); + + // Assertions on response fields + assertThat(responseMap).containsKey("result"); + assertThat(responseMap).containsKey("data"); + assertThat(((Map) responseMap.get("data")).get("resUserNm")).isEqualTo("홍길동"); + assertThat(((Map) responseMap.get("data")).get("resAuthenticityDesc")).isEqualTo("주민등록번호 진위확인 성공"); } }