From 8314c93c2b3188102bf762a1e4096a5c85cb43f4 Mon Sep 17 00:00:00 2001 From: forge-bot Date: Thu, 30 Jul 2026 13:00:29 +0000 Subject: [PATCH] =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EB=A7=A4=EC=9E=85=20?= =?UTF-8?q?=EC=8A=B9=EC=9D=B8=20=EA=B2=BD=EB=A1=9C=20Spring=20Boot=203=20?= =?UTF-8?q?=EC=A0=84=ED=99=98=20(ACX-E2E-1785394564819)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../approval/AcquisitionApprovalTest.java | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 proj-acquirex/src/test/java/com/acquirex/approval/AcquisitionApprovalTest.java diff --git a/proj-acquirex/src/test/java/com/acquirex/approval/AcquisitionApprovalTest.java b/proj-acquirex/src/test/java/com/acquirex/approval/AcquisitionApprovalTest.java new file mode 100644 index 0000000..9155f16 --- /dev/null +++ b/proj-acquirex/src/test/java/com/acquirex/approval/AcquisitionApprovalTest.java @@ -0,0 +1,158 @@ +package com.acquirex.approval; + +import com.acquirex.approval.domain.AcquisitionApproval; +import com.acquirex.approval.domain.AcquisitionApproval.ApprovalStatus; +import com.acquirex.approval.repository.AcquisitionApprovalRepository; +import com.acquirex.approval.service.AcquisitionApprovalService; +import com.acquirex.approval.service.AcquisitionApprovalService.ApprovalRequest; +import com.acquirex.approval.service.AcquisitionApprovalService.ApprovalResponse; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; + +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +/** 카드 매입 승인 통합 테스트 - Spring Boot 3 전환 검증 */ +@SpringBootTest +@AutoConfigureMockMvc +class AcquisitionApprovalTest { + + @Autowired private MockMvc mockMvc; + @Autowired private AcquisitionApprovalRepository repository; + @Autowired private AcquisitionApprovalService service; + + @BeforeEach + void setUp() { repository.deleteAll(); } + + // === Service Tests === + @Test + @DisplayName("매입 승인 요청 처리 성공") + void processApproval_Success() { + ApprovalRequest request = new ApprovalRequest("MERCH001", "1234567890123456", new BigDecimal("50000.00")); + ApprovalResponse response = service.processApproval(request); + + assertNotNull(response); + assertEquals("MERCH001", response.merchantId); + assertEquals(ApprovalStatus.APPROVED, response.status); + assertTrue(response.approvalNumber.startsWith("AP")); + assertTrue(response.cardNumber.matches("\\d{6}\*\*\*\*\\d{4}")); + } + + @Test + @DisplayName("승인 번호로 조회 성공") + void findByApprovalNumber_Success() { + ApprovalRequest request = new ApprovalRequest("MERCH001", "1234567890123456", new BigDecimal("50000.00")); + ApprovalResponse created = service.processApproval(request); + + ApprovalResponse found = service.findByApprovalNumber(created.approvalNumber); + assertNotNull(found); + assertEquals(created.approvalNumber, found.approvalNumber); + } + + @Test + @DisplayName("승인 번호로 조회 - 존재하지 않는 경우 예외 발생") + void findByApprovalNumber_NotFound() { + assertThrows(IllegalArgumentException.class, () -> service.findByApprovalNumber("NOTEXIST")); + } + + @Test + @DisplayName("승인 취소 성공") + void cancelApproval_Success() { + ApprovalRequest request = new ApprovalRequest("MERCH001", "1234567890123456", new BigDecimal("50000.00")); + ApprovalResponse created = service.processApproval(request); + + ApprovalResponse cancelled = service.cancelApproval(created.id); + assertEquals(ApprovalStatus.CANCELLED, cancelled.status); + } + + @Test + @DisplayName("승인 취소 - 이미 취소된 경우 예외 발생") + void cancelApproval_AlreadyCancelled() { + ApprovalRequest request = new ApprovalRequest("MERCH001", "1234567890123456", new BigDecimal("50000.00")); + ApprovalResponse created = service.processApproval(request); + service.cancelApproval(created.id); + + assertThrows(IllegalStateException.class, () -> service.cancelApproval(created.id)); + } + + // === Controller Tests === + @Test + @DisplayName("POST /api/v1/acquisitions/approvals - 승인 요청 성공") + void createApproval_Success() throws Exception { + String json = "{\"merchantId\":\"MERCH001\",\"cardNumber\":\"1234567890123456\",\"approvalAmount\":50000.00}"; + + mockMvc.perform(post("/api/v1/acquisitions/approvals") + .contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.merchantId").value("MERCH001")) + .andExpect(jsonPath("$.status").value("APPROVED")); + } + + @Test + @DisplayName("POST /api/v1/acquisitions/approvals - 유효성 검증 실패") + void createApproval_ValidationError() throws Exception { + String json = "{\"merchantId\":\"\",\"cardNumber\":\"123\",\"approvalAmount\":-100}"; + + mockMvc.perform(post("/api/v1/acquisitions/approvals") + .contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isBadRequest()); + } + + @Test + @DisplayName("GET /api/v1/acquisitions/approvals/{approvalNumber} - 승인 조회 성공") + void getApproval_Success() throws Exception { + String json = "{\"merchantId\":\"MERCH001\",\"cardNumber\":\"1234567890123456\",\"approvalAmount\":50000.00}"; + MvcResult result = mockMvc.perform(post("/api/v1/acquisitions/approvals") + .contentType(MediaType.APPLICATION_JSON).content(json)).andReturn(); + + String approvalNumber = com.jayway.jsonpath.JsonPath.read(result.getResponse().getContentAsString(), "$.approvalNumber"); + + mockMvc.perform(get("/api/v1/acquisitions/approvals/{approvalNumber}", approvalNumber)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.approvalNumber").value(approvalNumber)); + } + + @Test + @DisplayName("POST /api/v1/acquisitions/approvals/{id}/cancel - 승인 취소 성공") + void cancelApproval_Controller_Success() throws Exception { + String json = "{\"merchantId\":\"MERCH001\",\"cardNumber\":\"1234567890123456\",\"approvalAmount\":50000.00}"; + MvcResult result = mockMvc.perform(post("/api/v1/acquisitions/approvals") + .contentType(MediaType.APPLICATION_JSON).content(json)).andReturn(); + + Long id = com.jayway.jsonpath.JsonPath.read(result.getResponse().getContentAsString(), "$.id"); + + mockMvc.perform(post("/api/v1/acquisitions/approvals/{id}/cancel", id)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status").value("CANCELLED")); + } + + // === Domain Tests === + @Test + @DisplayName("ApprovalStatus 모든 상태 확인") + void testAllStatuses() { + assertEquals(4, ApprovalStatus.values().length); + assertNotNull(ApprovalStatus.PENDING); + assertNotNull(ApprovalStatus.APPROVED); + assertNotNull(ApprovalStatus.REJECTED); + assertNotNull(ApprovalStatus.CANCELLED); + } + + @Test + @DisplayName("ApprovalStatus 설명 확인") + void testStatusDescriptions() { + assertEquals("대기", ApprovalStatus.PENDING.getDescription()); + assertEquals("승인", ApprovalStatus.APPROVED.getDescription()); + assertEquals("거절", ApprovalStatus.REJECTED.getDescription()); + assertEquals("취소", ApprovalStatus.CANCELLED.getDescription()); + } +} \ No newline at end of file