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> 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> 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> 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; } }