From 30eec5f5702c29eb962e3276ecad60f0008e4cbb Mon Sep 17 00:00:00 2001 From: forge-bot Date: Sat, 18 Jul 2026 11:17:52 +0000 Subject: [PATCH] =?UTF-8?q?[=EB=A7=A4=EC=9E=85]=20mg=5Frecv=5Fsvc=20?= =?UTF-8?q?=E2=86=92=20=EC=A0=84=EB=AC=B8=EC=88=98=EC=8B=A0=20@Service=20(?= =?UTF-8?q?ACM-MG-004)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/TxMessageReceiveServiceTest.java | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 boot/modules/acquiring/src/test/java/com/klaro/acquirecore/acquiring/service/TxMessageReceiveServiceTest.java diff --git a/boot/modules/acquiring/src/test/java/com/klaro/acquirecore/acquiring/service/TxMessageReceiveServiceTest.java b/boot/modules/acquiring/src/test/java/com/klaro/acquirecore/acquiring/service/TxMessageReceiveServiceTest.java new file mode 100644 index 0000000..9f46778 --- /dev/null +++ b/boot/modules/acquiring/src/test/java/com/klaro/acquirecore/acquiring/service/TxMessageReceiveServiceTest.java @@ -0,0 +1,158 @@ +package com.klaro.acquirecore.acquiring.service; + +import com.klaro.acquirecore.acquiring.dto.TxMessage; +import com.klaro.acquirecore.acquiring.dto.TxResult; +import com.klaro.acquirecore.acquiring.repository.TxRepository; +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.nio.charset.StandardCharsets; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class TxMessageReceiveServiceTest { + + @Mock + private TxRepository txRepository; + + private TxMessageCodec codec; + private TxMessageReceiveService service; + + @BeforeEach + void setUp() { + codec = new TxMessageCodec(new com.fasterxml.jackson.databind.ObjectMapper()); + service = new TxMessageReceiveService(codec, txRepository); + } + + @Test + void receive_validApprovalMessage_returnsSuccess() { + // Given + byte[] raw = buildRawMessage("REQ", "M001", "T001", "10000"); + when(txRepository.isMerchantActive("M001")).thenReturn(true); + when(txRepository.isTerminalActive("M001", "T001")).thenReturn(true); + + // When + TxResult result = service.receive(raw); + + // Then + assertTrue(result.isSuccess()); + assertEquals("0000", result.getCode()); + verify(txRepository).saveTransaction(any(TxMessage.class)); + } + + @Test + void receive_missingMerchantId_returnsError() { + // Given + byte[] raw = buildRawMessage("REQ", "", "T001", "10000"); + + // When + TxResult result = service.receive(raw); + + // Then + assertFalse(result.isSuccess()); + assertEquals("1001", result.getCode()); + } + + @Test + void receive_missingTerminalId_returnsError() { + // Given + byte[] raw = buildRawMessage("REQ", "M001", "", "10000"); + + // When + TxResult result = service.receive(raw); + + // Then + assertFalse(result.isSuccess()); + assertEquals("1002", result.getCode()); + } + + @Test + void receive_invalidAmount_returnsError() { + // Given + byte[] raw = buildRawMessage("REQ", "M001", "T001", "invalid"); + + // When + TxResult result = service.receive(raw); + + // Then + assertFalse(result.isSuccess()); + assertEquals("1004", result.getCode()); + } + + @Test + void receive_inactiveMerchant_returnsError() { + // Given + byte[] raw = buildRawMessage("REQ", "M001", "T001", "10000"); + when(txRepository.isMerchantActive("M001")).thenReturn(false); + + // When + TxResult result = service.receive(raw); + + // Then + assertFalse(result.isSuccess()); + assertEquals("2001", result.getCode()); + } + + @Test + void receive_inactiveTerminal_returnsError() { + // Given + byte[] raw = buildRawMessage("REQ", "M001", "T001", "10000"); + when(txRepository.isMerchantActive("M001")).thenReturn(true); + when(txRepository.isTerminalActive("M001", "T001")).thenReturn(false); + + // When + TxResult result = service.receive(raw); + + // Then + assertFalse(result.isSuccess()); + assertEquals("2002", result.getCode()); + } + + @Test + void receive_cancelMessage_callsCancellation() { + // Given + byte[] raw = buildRawMessage("CANCEL", "M001", "T001", "10000"); + when(txRepository.isMerchantActive("M001")).thenReturn(true); + when(txRepository.isTerminalActive("M001", "T001")).thenReturn(true); + when(txRepository.transactionExists(anyString())).thenReturn(true); + when(txRepository.getTransactionStatus(anyString())).thenReturn("APPROVED"); + + // When + TxResult result = service.receive(raw); + + // Then + assertTrue(result.isSuccess()); + verify(txRepository).updateTransactionStatus(anyString(), eq("CANCELLED")); + } + + @Test + void receive_cancelNonExistentTransaction_returnsError() { + // Given + byte[] raw = buildRawMessage("CANCEL", "M001", "T001", "10000"); + when(txRepository.isMerchantActive("M001")).thenReturn(true); + when(txRepository.isTerminalActive("M001", "T001")).thenReturn(true); + when(txRepository.transactionExists(anyString())).thenReturn(false); + + // When + TxResult result = service.receive(raw); + + // Then + assertFalse(result.isSuccess()); + assertEquals("3001", result.getCode()); + } + + private byte[] buildRawMessage(String status, String merchantId, String terminalId, String amount) { + String body = String.format( + "{\"STATUS\":\"%s\",\"MERCHANTID\":\"%s\",\"TERMINALID\":\"%s\",\"AMOUNT\":\"%s\"}", + status, merchantId, terminalId, amount); + String header = String.format("%-20s", "TXMSG"); + return (header + body).getBytes(StandardCharsets.ISO_8859_1); + } +}