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<ApprovalTask> taskCaptor = ArgumentCaptor.forClass(ApprovalTask.class);
|
verify(approvalTaskMapper, org.mockito.Mockito.times(2)).updateById(taskCaptor.capture());
|
List<ApprovalTask> 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<ApprovalTask> taskCaptor = ArgumentCaptor.forClass(ApprovalTask.class);
|
verify(approvalTaskMapper, times(3)).insert(taskCaptor.capture());
|
List<ApprovalTask> 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());
|
}
|
}
|