From 5461d752915b3fe4aef5ffe69c3380002914a731 Mon Sep 17 00:00:00 2001 From: forge-bot Date: Thu, 30 Jul 2026 12:16:45 +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 --- .../CardAcquisitionServiceTest.java | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 src/test/java/com/acquirex/cardacquisition/CardAcquisitionServiceTest.java diff --git a/src/test/java/com/acquirex/cardacquisition/CardAcquisitionServiceTest.java b/src/test/java/com/acquirex/cardacquisition/CardAcquisitionServiceTest.java new file mode 100644 index 0000000..57c3151 --- /dev/null +++ b/src/test/java/com/acquirex/cardacquisition/CardAcquisitionServiceTest.java @@ -0,0 +1,98 @@ +package com.acquirex.cardacquisition; + +import com.acquirex.cardacquisition.entity.CardAcquisition; +import com.acquirex.cardacquisition.repository.CardAcquisitionRepository; +import com.acquirex.cardacquisition.service.CardAcquisitionService; +import org.junit.jupiter.api.BeforeEach; +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 java.util.List; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class CardAcquisitionServiceTest { + + @Mock + private CardAcquisitionRepository repository; + + private CardAcquisitionService service; + + @BeforeEach + void setUp() { + service = new CardAcquisitionService(repository); + } + + @Test + void requestAcquisition_ValidRequest_ReturnsApprovedResponse() { + when(repository.save(any(CardAcquisition.class))).thenAnswer(i -> { + CardAcquisition e = i.getArgument(0); + if (e.getId() == null) e.setId(1L); + return e; + }); + when(repository.findByRequestTimeBetween(any(), any())).thenReturn(List.of()); + + AcquisitionRequest request = new AcquisitionRequest("MERCHANT001", "1234567890123456", new BigDecimal("50000"), "KRW"); + AcquisitionResponse response = service.requestAcquisition(request); + + assertNotNull(response); + assertEquals(1L, response.getId()); + assertEquals(CardAcquisition.AcquisitionStatus.APPROVED, response.getStatus()); + assertTrue(response.getApprovalCode().startsWith("APR")); + verify(repository, times(2)).save(any(CardAcquisition.class)); + } + + @Test + void requestAcquisition_ExceedsLimit_ThrowsException() { + AcquisitionRequest request = new AcquisitionRequest("MERCHANT001", "1234567890123456", new BigDecimal("15000000"), "KRW"); + assertThrows(CardAcquisitionService.InvalidAcquisitionException.class, () -> service.requestAcquisition(request)); + } + + @Test + void getAcquisition_ExistingId_ReturnsResponse() { + CardAcquisition entity = new CardAcquisition("M1", "1111", new BigDecimal("1000"), "KRW"); + entity.setId(1L); + entity.approve("APR123"); + when(repository.findById(1L)).thenReturn(Optional.of(entity)); + + AcquisitionResponse response = service.getAcquisition(1L); + + assertNotNull(response); + assertEquals(CardAcquisition.AcquisitionStatus.APPROVED, response.getStatus()); + } + + @Test + void getAcquisition_NotFound_ThrowsException() { + when(repository.findById(999L)).thenReturn(Optional.empty()); + assertThrows(CardAcquisitionService.AcquisitionNotFoundException.class, () -> service.getAcquisition(999L)); + } + + @Test + void cancelAcquisition_ExistingPending_ReturnsCancelled() { + CardAcquisition entity = new CardAcquisition("M1", "1111", new BigDecimal("1000"), "KRW"); + entity.setId(1L); + when(repository.findById(1L)).thenReturn(Optional.of(entity)); + when(repository.save(any())).thenAnswer(i -> i.getArgument(0)); + + AcquisitionResponse response = service.cancelAcquisition(1L); + + assertEquals(CardAcquisition.AcquisitionStatus.CANCELLED, response.getStatus()); + } + + @Test + void cancelAcquisition_AlreadyCancelled_ThrowsException() { + CardAcquisition entity = new CardAcquisition("M1", "1111", new BigDecimal("1000"), "KRW"); + entity.setId(1L); + entity.setStatus(CardAcquisition.AcquisitionStatus.CANCELLED); + when(repository.findById(1L)).thenReturn(Optional.of(entity)); + + assertThrows(IllegalStateException.class, () -> service.cancelAcquisition(1L)); + } +} \ No newline at end of file