카드 매입 승인 경로 Spring Boot 3 전환 (ACX-E2E-1785394564819)
This commit is contained in:
parent
37e2f81ff9
commit
8314c93c2b
1 changed files with 158 additions and 0 deletions
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue