package jnpf.dmsService;
|
|
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
|
import jnpf.audit.sdk.annotation.AuditLog;
|
import jnpf.base.UserInfo;
|
import jnpf.dmsEntity.DmsDanganCundangShenqingDanganheEntity;
|
import jnpf.dmsEntity.DmsDanganJieyueFuyinShenqingZixiangEntity;
|
import jnpf.dmsEntity.form.DmsDanganJieyueFuyinGuihuanForm;
|
import jnpf.dmsEntity.vo.DmsDanganJieyueFuyinGuihuanCheckVO;
|
import jnpf.dmsMapper.DmsDanganCundangShenqingDanganheMapper;
|
import jnpf.dmsMapper.DmsDanganJieyueFuyinShenqingZixiangMapper;
|
import jnpf.dmsPermission.DmsCurrentIdentity;
|
import jnpf.dmsService.impl.DmsDanganJieyueFuyinGuihuanServiceImpl;
|
import jnpf.exception.DataException;
|
import org.apache.ibatis.builder.MapperBuilderAssistant;
|
import org.apache.ibatis.session.Configuration;
|
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.Test;
|
import org.mockito.ArgumentCaptor;
|
|
import java.lang.reflect.Method;
|
import java.util.Arrays;
|
import java.util.Date;
|
import java.util.List;
|
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.isNull;
|
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.when;
|
|
class DmsDanganJieyueFuyinGuihuanServiceTest {
|
|
@BeforeEach
|
void setUp() {
|
initialize(DmsDanganJieyueFuyinShenqingZixiangEntity.class);
|
initialize(DmsDanganCundangShenqingDanganheEntity.class);
|
}
|
|
@Test
|
void declaresTheBatchReturnAuditEvent() throws NoSuchMethodException {
|
Method method = DmsDanganJieyueFuyinGuihuanServiceImpl.class
|
.getMethod("guihuan", List.class);
|
AuditLog auditLog = method.getAnnotation(AuditLog.class);
|
|
assertNotNull(auditLog);
|
assertEquals("LOAN_COPY_RETURN", auditLog.action());
|
assertEquals("档案借阅复印归还", auditLog.label());
|
assertEquals("DMS_LOAN_COPY", auditLog.bizType());
|
assertEquals("档案借阅/复印归还", auditLog.bizModule());
|
assertEquals("", auditLog.bizCodeExpr());
|
assertTrue(!auditLog.bizCodeRequired());
|
assertEquals("dms_dangan_jieyue_fuyin_shenqing_zixiang", auditLog.targetTable());
|
assertEquals("#p0[0].fId", auditLog.targetIdExpr());
|
assertEquals("#p0.![fId]", auditLog.targetIdsExpr());
|
assertTrue(auditLog.diff());
|
assertEquals(DmsDanganJieyueFuyinShenqingZixiangEntity.class, auditLog.entityClass());
|
}
|
|
@Test
|
void returnsDetailsAndClearsEveryRelatedDanganheLoan() throws Exception {
|
DmsDanganJieyueFuyinShenqingZixiangMapper zixiangMapper = mock(DmsDanganJieyueFuyinShenqingZixiangMapper.class);
|
DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class);
|
DmsCurrentIdentity currentIdentity = mock(DmsCurrentIdentity.class);
|
when(zixiangMapper.selectList(any())).thenReturn(Arrays.asList(detail("detail-1", "box-1"), detail("detail-2", "box-2")));
|
when(danganheMapper.update(isNull(), any())).thenReturn(2);
|
when(zixiangMapper.update(isNull(), any())).thenReturn(2);
|
when(currentIdentity.requireUser()).thenReturn(user("user-1", "org-1"));
|
|
service(zixiangMapper, danganheMapper, currentIdentity)
|
.guihuan(Arrays.asList(item("detail-1"), item("detail-2")));
|
|
ArgumentCaptor<Wrapper<DmsDanganCundangShenqingDanganheEntity>> danganheCaptor = ArgumentCaptor.forClass(Wrapper.class);
|
verify(danganheMapper).update(isNull(), danganheCaptor.capture());
|
com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<?> clearLoan =
|
(com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<?>) danganheCaptor.getValue();
|
assertTrue(clearLoan.getSqlSet().contains("jieyue_id"));
|
assertTrue(clearLoan.getParamNameValuePairs().containsValue(null));
|
|
ArgumentCaptor<Wrapper<DmsDanganJieyueFuyinShenqingZixiangEntity>> detailCaptor = ArgumentCaptor.forClass(Wrapper.class);
|
verify(zixiangMapper).update(isNull(), detailCaptor.capture());
|
com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<?> update =
|
(com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<?>) detailCaptor.getValue();
|
assertTrue(update.getSqlSet().contains("guihuan_ren"));
|
assertTrue(update.getSqlSet().contains("guihuan_riqi"));
|
assertTrue(update.getSqlSet().contains("guihuan_bumen"));
|
assertTrue(update.getParamNameValuePairs().containsValue("user-1"));
|
assertTrue(update.getParamNameValuePairs().containsValue("org-1"));
|
assertNotNull(update.getParamNameValuePairs().values().stream()
|
.filter(Date.class::isInstance)
|
.findFirst()
|
.orElse(null));
|
}
|
|
@Test
|
void rejectsDetailsThatHaveAlreadyBeenReturned() {
|
DmsDanganJieyueFuyinShenqingZixiangMapper zixiangMapper = mock(DmsDanganJieyueFuyinShenqingZixiangMapper.class);
|
DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class);
|
DmsCurrentIdentity currentIdentity = mock(DmsCurrentIdentity.class);
|
DmsDanganJieyueFuyinShenqingZixiangEntity detail = detail("detail-1", "box-1");
|
detail.setGuihuanRen("user-0");
|
when(zixiangMapper.selectList(any())).thenReturn(Arrays.asList(detail));
|
|
DataException error = assertThrows(DataException.class,
|
() -> service(zixiangMapper, danganheMapper, currentIdentity).guihuan(Arrays.asList(item("detail-1"))));
|
|
assertEquals("档案借阅复印子项已归还,不能重复归还", error.getMessage());
|
verify(danganheMapper, never()).update(any(), any());
|
verify(zixiangMapper, never()).update(any(), any());
|
verify(currentIdentity, never()).requireUser();
|
}
|
|
@Test
|
void returnsDetailsWhenTheCurrentUserHasNoDepartment() throws Exception {
|
DmsDanganJieyueFuyinShenqingZixiangMapper zixiangMapper = mock(DmsDanganJieyueFuyinShenqingZixiangMapper.class);
|
DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class);
|
DmsCurrentIdentity currentIdentity = mock(DmsCurrentIdentity.class);
|
when(zixiangMapper.selectList(any())).thenReturn(Arrays.asList(detail("detail-1", "box-1")));
|
when(danganheMapper.update(isNull(), any())).thenReturn(1);
|
when(zixiangMapper.update(isNull(), any())).thenReturn(1);
|
when(currentIdentity.requireUser()).thenReturn(user("user-1", null));
|
|
service(zixiangMapper, danganheMapper, currentIdentity).guihuan(Arrays.asList(item("detail-1")));
|
|
ArgumentCaptor<Wrapper<DmsDanganJieyueFuyinShenqingZixiangEntity>> captor = ArgumentCaptor.forClass(Wrapper.class);
|
verify(zixiangMapper).update(isNull(), captor.capture());
|
com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<?> update =
|
(com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<?>) captor.getValue();
|
assertTrue(update.getParamNameValuePairs().containsValue(null));
|
}
|
|
@Test
|
void returnsTheAvailableDetailForABoxNumberOrId() throws Exception {
|
DmsDanganJieyueFuyinShenqingZixiangMapper zixiangMapper = mock(DmsDanganJieyueFuyinShenqingZixiangMapper.class);
|
DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class);
|
DmsCurrentIdentity currentIdentity = mock(DmsCurrentIdentity.class);
|
DmsDanganJieyueFuyinShenqingZixiangEntity detail = detail("detail-1", "box-1");
|
detail.setDanganheBianhao("DAH-001");
|
detail.setDanganheMingcheng("档案盒一");
|
detail.setShenqingRen("applicant-1");
|
detail.setShenqingBumen("department-1");
|
detail.setJieshouRen("receiver-1");
|
detail.setJieshouBumen("receiving-department-1");
|
detail.setShifouYitongguo("yes");
|
when(zixiangMapper.selectList(any())).thenReturn(Arrays.asList(detail));
|
|
DmsDanganJieyueFuyinGuihuanCheckVO result = service(zixiangMapper, danganheMapper, currentIdentity)
|
.check("DAH-001");
|
|
assertEquals("detail-1", result.getId());
|
assertEquals("box-1", result.getDanganheId());
|
assertEquals("DAH-001", result.getDanganheBianhao());
|
assertEquals("档案盒一", result.getDanganheMingcheng());
|
assertEquals("applicant-1", result.getShenqingRen());
|
assertEquals("department-1", result.getShenqingBumen());
|
assertEquals("receiver-1", result.getJieshouRen());
|
assertEquals("receiving-department-1", result.getJieshouBumen());
|
}
|
|
@Test
|
void rejectsWhenNoAvailableDetailExistsForTheBox() {
|
DmsDanganJieyueFuyinShenqingZixiangMapper zixiangMapper = mock(DmsDanganJieyueFuyinShenqingZixiangMapper.class);
|
DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class);
|
DmsCurrentIdentity currentIdentity = mock(DmsCurrentIdentity.class);
|
when(zixiangMapper.selectList(any())).thenReturn(Arrays.asList());
|
|
DataException error = assertThrows(DataException.class,
|
() -> service(zixiangMapper, danganheMapper, currentIdentity).check("DAH-001"));
|
|
assertEquals("未找到可归还的档案借阅复印子项", error.getMessage());
|
}
|
|
private void initialize(Class<?> entityClass) {
|
if (TableInfoHelper.getTableInfo(entityClass) == null) {
|
TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new Configuration(), ""), entityClass);
|
}
|
}
|
|
private DmsDanganJieyueFuyinGuihuanService service(
|
DmsDanganJieyueFuyinShenqingZixiangMapper zixiangMapper,
|
DmsDanganCundangShenqingDanganheMapper danganheMapper,
|
DmsCurrentIdentity currentIdentity) {
|
return new DmsDanganJieyueFuyinGuihuanServiceImpl(zixiangMapper, danganheMapper, currentIdentity);
|
}
|
|
private DmsDanganJieyueFuyinGuihuanForm item(String id) {
|
DmsDanganJieyueFuyinGuihuanForm form = new DmsDanganJieyueFuyinGuihuanForm();
|
form.setId(id);
|
form.setFId(id);
|
return form;
|
}
|
|
private DmsDanganJieyueFuyinShenqingZixiangEntity detail(String id, String danganheId) {
|
DmsDanganJieyueFuyinShenqingZixiangEntity detail = new DmsDanganJieyueFuyinShenqingZixiangEntity();
|
detail.setId(id);
|
detail.setDanganheId(danganheId);
|
return detail;
|
}
|
|
private UserInfo user(String userId, String organizeId) {
|
UserInfo user = new UserInfo();
|
user.setUserId(userId);
|
user.setOrganizeId(organizeId);
|
return user;
|
}
|
}
|