package com.eactive.eai.manage.inflow; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.http.ResponseEntity; import org.springframework.test.util.ReflectionTestUtils; /** * InflowGroupMetricController 단위 테스트. * *

Spring MVC를 기동하지 않고 컨트롤러를 직접 인스턴스화하여 * 응답 구조(success, data, count, message)를 검증한다. */ class InflowGroupMetricControllerTest { private InflowGroupMetricController controller; private InflowGroupMetricService mockService; @BeforeEach void setUp() { controller = new InflowGroupMetricController(); mockService = mock(InflowGroupMetricService.class); ReflectionTestUtils.setField(controller, "metricService", mockService); } // ------------------------------------------------------------------------- // Helper // ------------------------------------------------------------------------- private GroupMetricDTO makeDTO(String groupId, String groupName, long allowed, long rejPs, long rejTh) { GroupMetricDTO dto = new GroupMetricDTO(); dto.setGroupId(groupId); dto.setGroupName(groupName); dto.setActivate(true); dto.setAllowed(allowed); dto.setRejectedPerSecond(rejPs); dto.setRejectedThreshold(rejTh); long total = allowed + rejPs + rejTh; dto.setTotalRequests(total); dto.setRejectRatio(total > 0 ? (double)(rejPs + rejTh) / total * 100 : 0.0); dto.setLastResetTime(System.currentTimeMillis()); return dto; } @SuppressWarnings("unchecked") private Map body(ResponseEntity response) { return (Map) response.getBody(); } // ========================================================================= // GET /{groupId}/metric // ========================================================================= @Test void getGroupMetric_found_successTrueAndDataPresent() { GroupMetricDTO dto = makeDTO("G1", "결제그룹", 900, 60, 40); when(mockService.getGroupMetric("G1")).thenReturn(dto); ResponseEntity response = controller.getGroupMetric("G1"); Map body = body(response); assertEquals(200, response.getStatusCodeValue()); assertEquals(Boolean.TRUE, body.get("success")); assertSame(dto, body.get("data")); assertFalse(body.containsKey("message"), "성공 응답에 message 필드는 없어야 합니다"); } @Test void getGroupMetric_notFound_successFalseWithMessage() { when(mockService.getGroupMetric("GHOST")).thenReturn(null); ResponseEntity response = controller.getGroupMetric("GHOST"); Map body = body(response); assertEquals(200, response.getStatusCodeValue()); assertEquals(Boolean.FALSE, body.get("success")); assertTrue(body.get("message").toString().contains("GHOST"), "오류 메시지에 groupId가 포함되어야 합니다"); } // ========================================================================= // GET /metric // ========================================================================= @Test void getAllGroupMetrics_returnsListAndCount() { List list = Arrays.asList( makeDTO("G1", "그룹1", 100, 5, 0), makeDTO("G2", "그룹2", 200, 0, 10) ); when(mockService.getAllGroupMetrics()).thenReturn(list); ResponseEntity response = controller.getAllGroupMetrics(); Map body = body(response); assertEquals(Boolean.TRUE, body.get("success")); assertSame(list, body.get("data")); assertEquals(2, body.get("count")); } @Test void getAllGroupMetrics_emptyList_countZero() { when(mockService.getAllGroupMetrics()).thenReturn(Collections.emptyList()); ResponseEntity response = controller.getAllGroupMetrics(); Map body = body(response); assertEquals(Boolean.TRUE, body.get("success")); assertEquals(0, body.get("count")); } // ========================================================================= // POST /{groupId}/metric/reset // ========================================================================= @Test void resetGroupMetric_success_successTrueWithGroupId() { when(mockService.resetGroupMetric("G1")).thenReturn(true); ResponseEntity response = controller.resetGroupMetric("G1"); Map body = body(response); assertEquals(Boolean.TRUE, body.get("success")); assertTrue(body.get("message").toString().contains("G1"), "성공 메시지에 groupId가 포함되어야 합니다"); } @Test void resetGroupMetric_notFound_successFalseWithGroupId() { when(mockService.resetGroupMetric("GHOST")).thenReturn(false); ResponseEntity response = controller.resetGroupMetric("GHOST"); Map body = body(response); assertEquals(Boolean.FALSE, body.get("success")); assertTrue(body.get("message").toString().contains("GHOST"), "오류 메시지에 groupId가 포함되어야 합니다"); } // ========================================================================= // POST /metric/reset // ========================================================================= @Test void resetAllGroupMetrics_alwaysSuccessTrue() { doNothing().when(mockService).resetAllGroupMetrics(); ResponseEntity response = controller.resetAllGroupMetrics(); Map body = body(response); assertEquals(Boolean.TRUE, body.get("success")); assertNotNull(body.get("message")); verify(mockService).resetAllGroupMetrics(); } @Test void resetAllGroupMetrics_callsDelegateOnce() { doNothing().when(mockService).resetAllGroupMetrics(); controller.resetAllGroupMetrics(); verify(mockService, times(1)).resetAllGroupMetrics(); } }