package com.sinata.appointment.service; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.sinata.appointment.config.MiniStpUtil; import com.sinata.appointment.constants.ApprovalNodeCode; import com.sinata.appointment.constants.ApprovalTaskStatus; import com.sinata.appointment.dto.MiniApprovalActionRequest; import com.sinata.appointment.entity.AppointmentOrder; import com.sinata.appointment.entity.ApprovalInstance; import com.sinata.appointment.entity.ApprovalTask; import com.sinata.appointment.mapper.AppointmentOrderMapper; import com.sinata.appointment.mapper.ApprovalInstanceMapper; import com.sinata.appointment.mapper.ApprovalTaskMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockedStatic; import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) class MiniHandlerApprovalApplicationServiceTest { @Mock private ApprovalTaskMapper approvalTaskMapper; @Mock private ApprovalInstanceMapper approvalInstanceMapper; @Mock private AppointmentOrderMapper appointmentOrderMapper; @Mock private ApprovalEngineService approvalEngineService; @Mock private PostApprovalOrchestrationService postApprovalOrchestrationService; @Mock private com.sinata.appointment.mapper.BizApprovalNodeConfigMapper bizApprovalNodeConfigMapper; @Mock private com.sinata.appointment.mapper.MpPassAccessAreaMapper mpPassAccessAreaMapper; @Mock private com.sinata.appointment.mapper.MpPassLocalUnitMapper mpPassLocalUnitMapper; @Mock private com.fasterxml.jackson.databind.ObjectMapper objectMapper; @InjectMocks private MiniHandlerApprovalApplicationService miniHandlerApprovalApplicationService; @Test void handleOtherActionShouldAppendNoticeIdsWithoutDuplicatesForLevel3() { ApprovalTask task = new ApprovalTask(); task.setId(100L); task.setUuid("task-uuid"); task.setInstanceId(300L); task.setNodeCode(ApprovalNodeCode.LEVEL3_LOCAL_DEPT_LEADER); task.setAssigneeUserId(99L); task.setTaskStatus(ApprovalTaskStatus.PENDING); task.setNoticeIds("2,3"); ApprovalInstance inst = new ApprovalInstance(); inst.setId(300L); inst.setOrderId(200L); AppointmentOrder order = new AppointmentOrder(); order.setId(200L); MiniApprovalActionRequest request = new MiniApprovalActionRequest(); request.setTaskId(100L); request.setTaskUuid("task-uuid"); request.setApprove(true); request.setComment("同意"); request.setNoticeIds(java.util.List.of(3L, 4L, 4L)); when(approvalTaskMapper.selectById(100L)).thenReturn(task); when(approvalInstanceMapper.selectById(300L)).thenReturn(inst, inst); when(appointmentOrderMapper.selectById(200L)).thenReturn(order); when(approvalEngineService.isCurrentNodeComplete(inst)).thenReturn(false); try (MockedStatic mockedStatic = mockStatic(MiniStpUtil.class)) { mockedStatic.when(MiniStpUtil::getLoginIdAsLong).thenReturn(99L); miniHandlerApprovalApplicationService.handleOtherAction(request); } ArgumentCaptor taskCaptor = ArgumentCaptor.forClass(ApprovalTask.class); verify(approvalTaskMapper).updateById(taskCaptor.capture()); assertEquals("2,3,4", taskCaptor.getValue().getNoticeIds()); } }