package com.dalab.adminservice.service.impl; import com.dalab.adminservice.client.*; import com.dalab.adminservice.dto.AggregatedJobStatusDTO; import com.dalab.adminservice.dto.JobStatusDTO; import org.junit.jupiter.api.BeforeEach; 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.time.LocalDateTime; import java.util.Collections; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class JobStatusServiceImplTest { @Mock private IDiscoveryJobApiClient discoveryJobApiClient; @Mock private IAutolabelJobApiClient autolabelJobApiClient; @Mock private IAutoarchivalTaskApiClient autoarchivalTaskApiClient; @Mock private IAutodeleteTaskApiClient autodeleteTaskApiClient; @Mock private IAutocomplianceJobApiClient autocomplianceJobApiClient; @InjectMocks private JobStatusServiceImpl jobStatusService; private JobStatusDTO sampleJob1, sampleJob2; @BeforeEach void setUp() { sampleJob1 = JobStatusDTO.builder() .jobId("job1") .serviceName("TestService1") .status("COMPLETED_SUCCESS") .submittedAt(LocalDateTime.now().minusHours(2)) .completedAt(LocalDateTime.now().minusHours(1)) .build(); sampleJob2 = JobStatusDTO.builder() .jobId("job2") .serviceName("TestService2") .status("PENDING") .submittedAt(LocalDateTime.now().minusMinutes(30)) .build(); } @Test void getAggregatedJobStatuses_shouldAggregateFromAllClients() { when(discoveryJobApiClient.getDiscoveryJobs()).thenReturn(List.of(sampleJob1)); when(autolabelJobApiClient.getAutolabelJobs()).thenReturn(List.of(sampleJob2)); when(autoarchivalTaskApiClient.getArchivalTasks()).thenReturn(Collections.emptyList()); when(autodeleteTaskApiClient.getDeletionTasks()).thenReturn(Collections.emptyList()); when(autocomplianceJobApiClient.getComplianceReportJobs()).thenReturn(Collections.emptyList()); AggregatedJobStatusDTO result = jobStatusService.getAggregatedJobStatuses(); assertNotNull(result); assertEquals(2, result.getTotalJobs()); assertEquals(1, result.getCompletedSuccessJobs()); assertEquals(1, result.getPendingJobs()); assertEquals(0, result.getRunningJobs()); assertEquals(0, result.getCompletedFailedJobs()); assertNotNull(result.getJobs()); assertEquals(2, result.getJobs().size()); } @Test void getAggregatedJobStatuses_whenClientThrowsException_shouldHandleGracefully() { when(discoveryJobApiClient.getDiscoveryJobs()).thenThrow(new RuntimeException("Discovery Unreachable")); when(autolabelJobApiClient.getAutolabelJobs()).thenReturn(List.of(sampleJob2)); // Autolabel still works when(autoarchivalTaskApiClient.getArchivalTasks()).thenReturn(Collections.emptyList()); when(autodeleteTaskApiClient.getDeletionTasks()).thenReturn(Collections.emptyList()); when(autocomplianceJobApiClient.getComplianceReportJobs()).thenReturn(Collections.emptyList()); AggregatedJobStatusDTO result = jobStatusService.getAggregatedJobStatuses(); assertNotNull(result); assertEquals(1, result.getTotalJobs()); // Only sampleJob2 from autolabel assertEquals(0, result.getCompletedSuccessJobs()); assertEquals(1, result.getPendingJobs()); assertNotNull(result.getJobs()); assertEquals(1, result.getJobs().size()); assertEquals("job2", result.getJobs().get(0).getJobId()); } @Test void getAggregatedJobStatuses_whenAllClientsReturnEmpty_shouldReturnEmptyAggregation() { when(discoveryJobApiClient.getDiscoveryJobs()).thenReturn(Collections.emptyList()); when(autolabelJobApiClient.getAutolabelJobs()).thenReturn(Collections.emptyList()); when(autoarchivalTaskApiClient.getArchivalTasks()).thenReturn(Collections.emptyList()); when(autodeleteTaskApiClient.getDeletionTasks()).thenReturn(Collections.emptyList()); when(autocomplianceJobApiClient.getComplianceReportJobs()).thenReturn(Collections.emptyList()); AggregatedJobStatusDTO result = jobStatusService.getAggregatedJobStatuses(); assertNotNull(result); assertEquals(0, result.getTotalJobs()); assertEquals(0, result.getPendingJobs()); assertEquals(0, result.getCompletedSuccessJobs()); assertNotNull(result.getJobs()); assertEquals(0, result.getJobs().size()); } }