package jnpf.dmsService; import jnpf.dmsMapper.*; import jnpf.dmsEntity.storage.approval.DmsDisableRequest; import java.util.List; import java.util.stream.IntStream; import org.junit.jupiter.api.Test; import org.springframework.test.util.ReflectionTestUtils; import static org.mockito.Mockito.*; class DmsApprovedFileEffectiveJobTest { @Test void disabledStopFeatureNeverReadsNewColumnsOrNativeStopTables() { DmsApprovedBatchMapper batches=mock(DmsApprovedBatchMapper.class); DmsApprovedFileRetryService retry=mock(DmsApprovedFileRetryService.class); DmsApprovedDisableMapper stops=mock(DmsApprovedDisableMapper.class); DmsApprovedDisableService service=mock(DmsApprovedDisableService.class); DmsApprovedFileEffectiveJob job=new DmsApprovedFileEffectiveJob(batches,retry,stops,service); job.activateDue();verify(batches).discover();verify(batches).retryCandidates(false,true); verifyNoInteractions(stops,service); ReflectionTestUtils.setField(job,"disableEnabled",true);job.activateDue(); verify(stops).approvedApplications(null,100);verify(batches).retryCandidates(true,true); } @Test void failedFirstPageDoesNotStarveLaterApplicationsAndIsRetriedNextRun() { DmsApprovedBatchMapper batches=mock(DmsApprovedBatchMapper.class); DmsApprovedFileRetryService retry=mock(DmsApprovedFileRetryService.class); DmsApprovedDisableMapper stops=mock(DmsApprovedDisableMapper.class); DmsApprovedDisableService service=mock(DmsApprovedDisableService.class); DmsApprovedFileEffectiveJob job=new DmsApprovedFileEffectiveJob(batches,retry,stops,service); ReflectionTestUtils.setField(job,"disableEnabled",true); List first=IntStream.range(0,100).mapToObj(i->application("failed-"+i)).toList(); DmsDisableRequest later=application("later"); when(stops.approvedApplications(null,100)).thenReturn(first); when(stops.approvedApplications(first.get(99),100)).thenReturn(List.of(later)); when(service.enqueue(eq("tenant"),eq("flow"),startsWith("failed-"),eq("yichexiao"))) .thenThrow(new IllegalStateException("persistent invalid application")); job.activateDue(); verify(service).enqueue("tenant","flow","later","yichexiao"); verify(batches).retryCandidates(true,true); job.activateDue(); verify(stops,times(2)).approvedApplications(null,100); verify(service,times(2)).enqueue("tenant","flow","failed-0","yichexiao"); verify(service,times(2)).enqueue("tenant","flow","later","yichexiao"); } @Test void fullSuccessfulPageUsesLastIdentityAfterRowsLeaveDiscoveryQuery() { DmsApprovedBatchMapper batches=mock(DmsApprovedBatchMapper.class); DmsApprovedDisableMapper stops=mock(DmsApprovedDisableMapper.class); DmsApprovedDisableService service=mock(DmsApprovedDisableService.class); DmsApprovedFileEffectiveJob job=new DmsApprovedFileEffectiveJob(batches, mock(DmsApprovedFileRetryService.class),stops,service); ReflectionTestUtils.setField(job,"disableEnabled",true); List first=IntStream.range(0,100).mapToObj(i->application("task-"+i)).toList(); when(stops.approvedApplications(null,100)).thenReturn(first); job.activateDue(); verify(service,times(100)).enqueue(eq("tenant"),eq("flow"),anyString(),eq("yichexiao")); verify(stops).approvedApplications(null,100); verify(stops).approvedApplications(first.get(99),100); verifyNoMoreInteractions(stops); } @Test void disabledBackoffIsPassedToCandidateSelection() { DmsApprovedBatchMapper batches=mock(DmsApprovedBatchMapper.class); DmsApprovedFileEffectiveJob job=new DmsApprovedFileEffectiveJob(batches, mock(DmsApprovedFileRetryService.class),mock(DmsApprovedDisableMapper.class), mock(DmsApprovedDisableService.class)); ReflectionTestUtils.setField(job,"retryBackoffEnabled",false); job.activateDue(); verify(batches).retryCandidates(false,false); } private DmsDisableRequest application(String taskId) { DmsDisableRequest row=new DmsDisableRequest(); row.setTenantId("tenant");row.setFlowId("flow");row.setTaskId(taskId); row.setApplicationId("application-"+taskId);row.setOperation("yichexiao"); return row; } }