package jnpf.dmsService; import jnpf.base.ActionResult; import jnpf.dmsEntity.center.DmsCenterDisableCommand; import jnpf.dmsEntity.storage.approval.*; import jnpf.dmsMapper.DmsApprovedDisableMapper; import jnpf.exception.DataException; import org.junit.jupiter.api.*; import org.mockito.ArgumentCaptor; import org.springframework.test.util.ReflectionTestUtils; import java.util.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; class DmsApprovedDisableProcessorTest { DmsApprovedDisableMapper mapper=mock(DmsApprovedDisableMapper.class); DmsApprovedDisableService service=mock(DmsApprovedDisableService.class); DmsApprovedDisableClient client=mock(DmsApprovedDisableClient.class); DmsApprovedDisableProcessor processor=new DmsApprovedDisableProcessor(mapper,service,client); DmsApprovedBatch batch=new DmsApprovedBatch(); @BeforeEach void setup() { ReflectionTestUtils.setField(processor,"enabled",true); batch.setId(UUID.randomUUID());batch.setTenantId("tenant");batch.setAuditType("shixiao_shenqing");batch.setLeaseToken("lease"); } DmsDisableRequest row() { DmsDisableRequest r=new DmsDisableRequest();r.setId(UUID.randomUUID());r.setBatchId(batch.getId()); r.setTenantId("tenant");r.setOperation("yishixiao");r.setStatus("WAITING");return r; } @Test void successfulExecutionPassesLeaseAndRefreshesBatch() { DmsDisableRequest row=row();when(mapper.dueItems("tenant",batch.getId())).thenReturn(List.of(row)); when(client.disable(any())).thenReturn(ActionResult.success("完成")); assertDoesNotThrow(()->processor.process(batch)); ArgumentCaptor captured=ArgumentCaptor.forClass(DmsCenterDisableCommand.class); verify(client).disable(captured.capture()); assertEquals("lease",captured.getValue().getLeaseToken());assertEquals(row.getId(),captured.getValue().getRequestId()); verify(service).refreshProgress(batch); } @Test void failedItemDoesNotPreventLaterItemOrProgressRefresh() { when(mapper.dueItems("tenant",batch.getId())).thenReturn(List.of(row(),row())); when(client.disable(any())).thenThrow(new DataException("conflict")).thenReturn(ActionResult.success("完成")); assertEquals("conflict",assertThrows(DataException.class,()->processor.process(batch)).getMessage()); verify(client,times(2)).disable(any());verify(service).refreshProgress(batch); } @Test void missingOrFailedResponseCannotCountAsSuccess() { when(mapper.dueItems("tenant",batch.getId())).thenReturn(List.of(row(),row())); ActionResult failed=new ActionResult<>();failed.setCode(409);failed.setMsg("changed"); when(client.disable(any())).thenReturn(null,failed); assertEquals(1,assertThrows(DataException.class,()->processor.process(batch)).getSuppressed().length); verify(service).refreshProgress(batch); } @Test void noDueItemsMakesNoDisableAttempt() { when(mapper.dueItems("tenant",batch.getId())).thenReturn(List.of()); processor.process(batch);verifyNoInteractions(client);verify(service).refreshProgress(batch); } }