diff --git a/src/test/java/com/acquirex/service/CardAcquisitionServiceTest.java b/src/test/java/com/acquirex/service/CardAcquisitionServiceTest.java new file mode 100644 index 0000000..ce3c57e --- /dev/null +++ b/src/test/java/com/acquirex/service/CardAcquisitionServiceTest.java @@ -0,0 +1,103 @@ +package com.acquirex.service; + +import com.acquirex.domain.AcquisitionStatus; +import com.acquirex.domain.CardAcquisition; +import com.acquirex.repository.CardAcquisitionRepository; +import com.acquirex.service.CardAcquisitionService.AcquisitionRequest; +import com.acquirex.service.CardAcquisitionService.AcquisitionResponse; +import com.acquirex.service.CardAcquisitionService.ApprovalRequest; +import com.acquirex.service.CardAcquisitionService.AcquisitionNotFoundException; +import com.acquirex.service.CardAcquisitionService.InvalidAcquisitionStateException; +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.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Optional; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class CardAcquisitionServiceTest { + @Mock private CardAcquisitionRepository repository; + @InjectMocks private CardAcquisitionService service; + + private CardAcquisition pendingAcquisition; + + @BeforeEach + void setUp() { + pendingAcquisition = CardAcquisition.builder() + .id(1L).cardNumber("1234567890123456").merchantId("MERCHANT001") + .amount(new BigDecimal("50000.00")).status(AcquisitionStatus.PENDING) + .requestedAt(LocalDateTime.now()).build(); + } + + @Test + @DisplayName("매입 요청 저장 성공") + void requestAcquisition_Success() { + when(repository.save(any(CardAcquisition.class))).thenReturn(pendingAcquisition); + AcquisitionResponse result = service.requestAcquisition( + new AcquisitionRequest("1234567890123456", "MERCHANT001", new BigDecimal("50000.00"))); + assertThat(result.id()).isEqualTo(1L); + assertThat(result.status()).isEqualTo(AcquisitionStatus.PENDING); + verify(repository).save(any(CardAcquisition.class)); + } + + @Test + @DisplayName("매입 요청 조회 성공") + void getAcquisition_Success() { + when(repository.findById(1L)).thenReturn(Optional.of(pendingAcquisition)); + AcquisitionResponse result = service.getAcquisition(1L); + assertThat(result.id()).isEqualTo(1L); + } + + @Test + @DisplayName("매입 요청 조회 실패 - 존재하지 않음") + void getAcquisition_NotFound() { + when(repository.findById(999L)).thenReturn(Optional.empty()); + assertThatThrownBy(() -> service.getAcquisition(999L)) + .isInstanceOf(AcquisitionNotFoundException.class); + } + + @Test + @DisplayName("매입 승인 성공") + void approveAcquisition_Success() { + when(repository.findById(1L)).thenReturn(Optional.of(pendingAcquisition)); + when(repository.save(any(CardAcquisition.class))).thenAnswer(i -> i.getArgument(0)); + AcquisitionResponse result = service.approveAcquisition(1L, new ApprovalRequest("ADMIN001")); + assertThat(result.status()).isEqualTo(AcquisitionStatus.APPROVED); + assertThat(result.approvedBy()).isEqualTo("ADMIN001"); + } + + @Test + @DisplayName("매입 승인 실패 - 이미 처리됨") + void approveAcquisition_AlreadyProcessed() { + pendingAcquisition.setStatus(AcquisitionStatus.APPROVED); + when(repository.findById(1L)).thenReturn(Optional.of(pendingAcquisition)); + assertThatThrownBy(() -> service.approveAcquisition(1L, new ApprovalRequest("ADMIN001"))) + .isInstanceOf(InvalidAcquisitionStateException.class); + } + + @Test + @DisplayName("매입 거절 성공") + void rejectAcquisition_Success() { + when(repository.findById(1L)).thenReturn(Optional.of(pendingAcquisition)); + when(repository.save(any(CardAcquisition.class))).thenAnswer(i -> i.getArgument(0)); + AcquisitionResponse result = service.rejectAcquisition(1L, new ApprovalRequest("ADMIN001")); + assertThat(result.status()).isEqualTo(AcquisitionStatus.REJECTED); + } + + @Test + @DisplayName("대기 중인 요청 목록 조회") + void getPendingAcquisitions_Success() { + when(repository.findByStatus(AcquisitionStatus.PENDING)).thenReturn(java.util.List.of(pendingAcquisition)); + var result = service.getPendingAcquisitions(); + assertThat(result).hasSize(1); + assertThat(result.get(0).status()).isEqualTo(AcquisitionStatus.PENDING); + } +} \ No newline at end of file