카드 매입 승인 경로 Spring Boot 3 전환 #12

Closed
forge-bot wants to merge 8 commits from forge/ACX-E2E-1785394564819-attempt-13-run-dada4efd8b46 into main
Showing only changes of commit 8314c93c2b - Show all commits

View file

@ -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());
}
}