package com.sinata.appointment.service; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.sinata.appointment.constants.ApprovalNodeCode; import com.sinata.appointment.constants.ApprovalInstanceStatus; import com.sinata.appointment.constants.ApprovalTaskStatus; import com.sinata.appointment.constants.LocalUnitApproverType; import com.sinata.appointment.entity.AppointmentOrder; import com.sinata.appointment.entity.MpPassLocalUnit; import com.sinata.appointment.entity.MpUser; import com.sinata.appointment.entity.ApprovalInstance; import com.sinata.appointment.entity.ApprovalTask; import com.sinata.appointment.mapper.ApprovalInstanceMapper; import com.sinata.appointment.mapper.ApprovalTaskMapper; import com.sinata.appointment.mapper.BizApprovalNodeConfigMapper; import com.sinata.appointment.mapper.MpPassLocalUnitMapper; import com.sinata.appointment.mapper.MpPassLocalUnitMemberMapper; import com.sinata.appointment.mapper.MpStaffGroupMemberMapper; import com.sinata.appointment.mapper.MpUserMapper; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.test.util.ReflectionTestUtils; @ExtendWith(MockitoExtension.class) class ApprovalEngineServiceTest { @Mock private BizApprovalNodeConfigMapper bizApprovalNodeConfigMapper; @Mock private ApprovalInstanceMapper approvalInstanceMapper; @Mock private ApprovalTaskMapper approvalTaskMapper; @Mock private MpUserMapper mpUserMapper; @Mock private MpPassLocalUnitMapper mpPassLocalUnitMapper; @Mock private MpPassLocalUnitMemberMapper mpPassLocalUnitMemberMapper; @Mock private MpStaffGroupMemberMapper mpStaffGroupMemberMapper; @Mock private SysBizSettingCacheService sysBizSettingCacheService; @Test void cancelInstanceMarksPendingAndWaitingTasksAsCancelled() { ApprovalEngineService approvalEngineService = new ApprovalEngineService( bizApprovalNodeConfigMapper, approvalInstanceMapper, approvalTaskMapper, mpUserMapper, mpPassLocalUnitMapper, mpPassLocalUnitMemberMapper, mpStaffGroupMemberMapper, sysBizSettingCacheService, new ObjectMapper()); ApprovalInstance instance = new ApprovalInstance(); instance.setId(1L); instance.setStatus(ApprovalInstanceStatus.IN_PROGRESS); ApprovalTask pendingTask = new ApprovalTask(); pendingTask.setId(10L); pendingTask.setTaskStatus(ApprovalTaskStatus.PENDING); ApprovalTask waitingTask = new ApprovalTask(); waitingTask.setId(11L); waitingTask.setTaskStatus(ApprovalTaskStatus.WAITING); when(approvalTaskMapper.selectList(any())).thenReturn(List.of(pendingTask, waitingTask)); approvalEngineService.cancelInstance(instance, "预约人取消"); assertEquals(ApprovalInstanceStatus.CANCELLED, instance.getStatus()); verify(approvalInstanceMapper).updateById(instance); ArgumentCaptor taskCaptor = ArgumentCaptor.forClass(ApprovalTask.class); verify(approvalTaskMapper, org.mockito.Mockito.times(2)).updateById(taskCaptor.capture()); List updatedTasks = taskCaptor.getAllValues(); assertEquals(ApprovalTaskStatus.CANCELLED, updatedTasks.get(0).getTaskStatus()); assertEquals("预约人取消", updatedTasks.get(0).getComment()); assertEquals(ApprovalTaskStatus.CANCELLED, updatedTasks.get(1).getTaskStatus()); assertEquals("预约人取消", updatedTasks.get(1).getComment()); } @Test void createTasksForLocalUnitNodeStrictShouldMergeDeptApproversIntoOneUnitGroup() { ApprovalEngineService approvalEngineService = new ApprovalEngineService( bizApprovalNodeConfigMapper, approvalInstanceMapper, approvalTaskMapper, mpUserMapper, mpPassLocalUnitMapper, mpPassLocalUnitMemberMapper, mpStaffGroupMemberMapper, sysBizSettingCacheService, new ObjectMapper()); AppointmentOrder order = new AppointmentOrder(); order.setInvolveOtherLocalUnit(true); order.setPassLocalUnitIds("[11]"); MpPassLocalUnit unit = new MpPassLocalUnit(); unit.setId(11L); unit.setApproverType(LocalUnitApproverType.DEPT); unit.setApproverDeptIds("[100,101]"); MpUser deptUser1 = new MpUser(); deptUser1.setId(1L); MpUser deptUser2 = new MpUser(); deptUser2.setId(2L); MpUser deptUser3 = new MpUser(); deptUser3.setId(3L); when(mpPassLocalUnitMapper.selectList(any())).thenReturn(List.of(unit)); when(mpUserMapper.selectList(any())) .thenReturn(List.of(deptUser1, deptUser2), List.of(deptUser2, deptUser3)); int created = (int) ReflectionTestUtils.invokeMethod( approvalEngineService, "createTasksForLocalUnitNodeStrict", 99L, order, ApprovalTaskStatus.PENDING); assertEquals(3, created); ArgumentCaptor taskCaptor = ArgumentCaptor.forClass(ApprovalTask.class); verify(approvalTaskMapper, times(3)).insert(taskCaptor.capture()); List insertedTasks = taskCaptor.getAllValues(); assertEquals( List.of(1L, 2L, 3L), insertedTasks.stream().map(ApprovalTask::getAssigneeUserId).toList()); assertEquals( List.of( ApprovalNodeCode.LEVEL3_LOCAL_DEPT_LEADER + ":UNIT:11", ApprovalNodeCode.LEVEL3_LOCAL_DEPT_LEADER + ":UNIT:11", ApprovalNodeCode.LEVEL3_LOCAL_DEPT_LEADER + ":UNIT:11"), insertedTasks.stream().map(ApprovalTask::getGroupKey).toList()); } }