카드 매입 승인 경로 Spring Boot 3 전환 #6
1 changed files with 120 additions and 0 deletions
|
|
@ -0,0 +1,120 @@
|
|||
package com.acquirex.approval.service;
|
||||
|
||||
import com.acquirex.approval.domain.ApprovalRequest;
|
||||
import com.acquirex.approval.domain.ApprovalRequest.ApprovalStatus;
|
||||
import com.acquirex.approval.dto.ApprovalDto.Request;
|
||||
import com.acquirex.approval.dto.ApprovalDto.Response;
|
||||
import com.acquirex.approval.repository.ApprovalRequestRepository;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class ApprovalServiceTest {
|
||||
|
||||
@Mock
|
||||
private ApprovalRequestRepository repository;
|
||||
|
||||
private ApprovalService approvalService;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
approvalService = new ApprovalService(repository);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Should approve valid request")
|
||||
void processApproval_ValidRequest_ReturnsApproved() {
|
||||
Request dto = new Request("4532123456789012", "MERCHANT001", new BigDecimal("100.00"), "KRW");
|
||||
|
||||
ApprovalRequest savedRequest = new ApprovalRequest(dto.getCardNumber(), dto.getMerchantId(), dto.getAmount(), dto.getCurrency());
|
||||
savedRequest.setId(1L);
|
||||
|
||||
when(repository.save(any(ApprovalRequest.class))).thenReturn(savedRequest);
|
||||
|
||||
Response response = approvalService.processApproval(dto);
|
||||
|
||||
assertNotNull(response);
|
||||
assertEquals(ApprovalStatus.APPROVED, response.getStatus());
|
||||
assertNotNull(response.getApprovalCode());
|
||||
assertTrue(response.getApprovalCode().startsWith("APP-"));
|
||||
verify(repository, times(2)).save(any(ApprovalRequest.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Should decline request with invalid amount")
|
||||
void processApproval_InvalidAmount_ReturnsDeclined() {
|
||||
Request dto = new Request("4532123456789012", "MERCHANT001", new BigDecimal("-10.00"), "KRW");
|
||||
|
||||
ApprovalRequest savedRequest = new ApprovalRequest(dto.getCardNumber(), dto.getMerchantId(), dto.getAmount(), dto.getCurrency());
|
||||
savedRequest.setId(1L);
|
||||
|
||||
when(repository.save(any(ApprovalRequest.class))).thenReturn(savedRequest);
|
||||
|
||||
Response response = approvalService.processApproval(dto);
|
||||
|
||||
assertNotNull(response);
|
||||
assertEquals(ApprovalStatus.DECLINED, response.getStatus());
|
||||
assertEquals("Validation failed", response.getMessage());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Should decline request with short card number")
|
||||
void processApproval_ShortCardNumber_ReturnsDeclined() {
|
||||
Request dto = new Request("1234", "MERCHANT001", new BigDecimal("100.00"), "KRW");
|
||||
|
||||
ApprovalRequest savedRequest = new ApprovalRequest(dto.getCardNumber(), dto.getMerchantId(), dto.getAmount(), dto.getCurrency());
|
||||
savedRequest.setId(1L);
|
||||
|
||||
when(repository.save(any(ApprovalRequest.class))).thenReturn(savedRequest);
|
||||
|
||||
Response response = approvalService.processApproval(dto);
|
||||
|
||||
assertNotNull(response);
|
||||
assertEquals(ApprovalStatus.DECLINED, response.getStatus());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Should find approval by ID")
|
||||
void findById_ExistingId_ReturnsRequest() {
|
||||
ApprovalRequest request = new ApprovalRequest("4532123456789012", "MERCHANT001", new BigDecimal("100.00"), "KRW");
|
||||
request.setId(1L);
|
||||
request.setStatus(ApprovalStatus.APPROVED);
|
||||
|
||||
when(repository.findById(1L)).thenReturn(java.util.Optional.of(request));
|
||||
|
||||
ApprovalRequest result = approvalService.findById(1L);
|
||||
|
||||
assertNotNull(result);
|
||||
assertEquals(1L, result.getId());
|
||||
assertEquals(ApprovalStatus.APPROVED, result.getStatus());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Should throw exception for non-existing ID")
|
||||
void findById_NonExistingId_ThrowsException() {
|
||||
when(repository.findById(999L)).thenReturn(java.util.Optional.empty());
|
||||
|
||||
assertThrows(IllegalArgumentException.class, () -> approvalService.findById(999L));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Should count pending approvals")
|
||||
void countPendingApprovals_ReturnsCorrectCount() {
|
||||
when(repository.countByStatus(ApprovalStatus.PENDING)).thenReturn(5L);
|
||||
|
||||
long count = approvalService.countPendingApprovals();
|
||||
|
||||
assertEquals(5L, count);
|
||||
verify(repository).countByStatus(ApprovalStatus.PENDING);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue