package jnpf.dmsService; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import jnpf.dmsEntity.DmsWenjianFushenJihuaFenpeiEntity; import jnpf.dmsEntity.DmsWenjianFushenJihuaFenpeiZixiangEntity; import jnpf.dmsMapper.DmsWenjianFushenJihuaFenpeiMapper; import jnpf.dmsMapper.DmsWenjianFushenJihuaFenpeiZixiangMapper; import jnpf.dmsService.impl.DmsWenjianFushenJihuaFenpeiSyncServiceImpl; 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.util.Arrays; import java.util.Date; import java.util.List; 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 DmsWenjianFushenJihuaFenpeiSyncServiceTest { @BeforeEach void setUp() { initTableInfo(DmsWenjianFushenJihuaFenpeiEntity.class); initTableInfo(DmsWenjianFushenJihuaFenpeiZixiangEntity.class); } @Test void syncsEveryChildWithTheAssignmentValuesFromThePlan() throws Exception { DmsWenjianFushenJihuaFenpeiMapper fenpeiMapper = mock(DmsWenjianFushenJihuaFenpeiMapper.class); DmsWenjianFushenJihuaFenpeiZixiangMapper zixiangMapper = mock( DmsWenjianFushenJihuaFenpeiZixiangMapper.class); Date assignedAt = new Date(); when(fenpeiMapper.selectOne(any())).thenReturn(fenpei("dept-1", "user-1", assignedAt)); DmsWenjianFushenJihuaFenpeiSyncService service = service(fenpeiMapper, zixiangMapper); service.sync("plan-1"); ArgumentCaptor> captor = ArgumentCaptor.forClass( Wrapper.class); verify(zixiangMapper).update(isNull(), captor.capture()); LambdaUpdateWrapper update = (LambdaUpdateWrapper) captor.getValue(); assertTrue(update.getSqlSet().contains("fenpei_bumen_id")); assertTrue(update.getSqlSet().contains("fenpei_bumen_fuzeren")); assertTrue(update.getSqlSet().contains("fenpei_riqi")); assertTrue(update.getSqlSet().contains("biz_status")); assertTrue(update.getExpression().getNormal().getSqlSegment().contains("f_foreign_id")); assertTrue(update.getExpression().getNormal().getSqlSegment().contains("f_delete_mark")); assertTrue(update.getParamNameValuePairs().containsValue("plan-1")); assertTrue(update.getParamNameValuePairs().containsValue("dept-1")); assertTrue(update.getParamNameValuePairs().containsValue("user-1")); assertTrue(update.getParamNameValuePairs().containsValue(assignedAt)); assertTrue(update.getParamNameValuePairs().containsValue("daizhixing")); } @Test void reassignsMatchingChildrenFromOtherPlansWithoutDeletingThem() throws Exception { DmsWenjianFushenJihuaFenpeiMapper fenpeiMapper = mock(DmsWenjianFushenJihuaFenpeiMapper.class); DmsWenjianFushenJihuaFenpeiZixiangMapper zixiangMapper = mock( DmsWenjianFushenJihuaFenpeiZixiangMapper.class); Date assignedAt = new Date(); when(fenpeiMapper.selectOne(any())).thenReturn(fenpei("dept-1", "owner-1", assignedAt)); Date huiguShixian = new Date(); when(zixiangMapper.selectList(any())).thenReturn( Arrays.asList(child("new-detail-1", "file-1", huiguShixian)), Arrays.asList(child("existing-detail-1", "file-1", huiguShixian))); DmsWenjianFushenJihuaFenpeiSyncService service = service(fenpeiMapper, zixiangMapper); service.sync("plan-1"); ArgumentCaptor> captor = ArgumentCaptor.forClass( Wrapper.class); verify(zixiangMapper, org.mockito.Mockito.times(2)).update(isNull(), captor.capture()); List> updates = captor.getAllValues(); LambdaUpdateWrapper reassignmentUpdate = (LambdaUpdateWrapper) updates.get(0); assertTrue(reassignmentUpdate.getSqlSet().contains("huigu_ren")); assertTrue(reassignmentUpdate.getSqlSet().contains("fenpei_bumen_id")); assertTrue(reassignmentUpdate.getSqlSet().contains("fenpei_bumen_fuzeren")); assertTrue(reassignmentUpdate.getSqlSet().contains("fenpei_riqi")); assertTrue(reassignmentUpdate.getSqlSet().contains("biz_status")); assertTrue(reassignmentUpdate.getExpression().getNormal().getSqlSegment().contains("f_id")); assertTrue(reassignmentUpdate.getParamNameValuePairs().containsValue("existing-detail-1")); assertTrue(reassignmentUpdate.getParamNameValuePairs().containsValue("dept-1")); assertTrue(reassignmentUpdate.getParamNameValuePairs().containsValue("owner-1")); assertTrue(reassignmentUpdate.getParamNameValuePairs().containsValue(assignedAt)); assertTrue(reassignmentUpdate.getParamNameValuePairs().containsValue("daizhixing")); verify(zixiangMapper).deleteById("new-detail-1"); } @Test void doesNotUpdateChildrenWhenThePlanDoesNotExist() { DmsWenjianFushenJihuaFenpeiMapper fenpeiMapper = mock(DmsWenjianFushenJihuaFenpeiMapper.class); DmsWenjianFushenJihuaFenpeiZixiangMapper zixiangMapper = mock( DmsWenjianFushenJihuaFenpeiZixiangMapper.class); when(fenpeiMapper.selectOne(any())).thenReturn(null); DmsWenjianFushenJihuaFenpeiSyncService service = service(fenpeiMapper, zixiangMapper); DataException error = assertThrows(DataException.class, () -> service.sync("missing-plan")); assertEquals("未找到文件复审计划分配记录:f_id=missing-plan", error.getMessage()); verify(zixiangMapper, never()).update(any(), any()); } private DmsWenjianFushenJihuaFenpeiSyncService service( DmsWenjianFushenJihuaFenpeiMapper fenpeiMapper, DmsWenjianFushenJihuaFenpeiZixiangMapper zixiangMapper) { return new DmsWenjianFushenJihuaFenpeiSyncServiceImpl(fenpeiMapper, zixiangMapper); } private DmsWenjianFushenJihuaFenpeiEntity fenpei(String departmentId, String owner, Date assignedAt) { DmsWenjianFushenJihuaFenpeiEntity result = new DmsWenjianFushenJihuaFenpeiEntity(); result.setFenpeiBumenId(departmentId); result.setFenpeiBumenFuzeren(owner); result.setFenpeiRiqi(assignedAt); return result; } private DmsWenjianFushenJihuaFenpeiZixiangEntity child(String id, String wenjianId, Date huiguShixian) { DmsWenjianFushenJihuaFenpeiZixiangEntity result = new DmsWenjianFushenJihuaFenpeiZixiangEntity(); result.setId(id); result.setWenjianId(wenjianId); result.setHuiguShixian(huiguShixian); return result; } private void initTableInfo(Class entityClass) { if (TableInfoHelper.getTableInfo(entityClass) == null) { TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new Configuration(), ""), entityClass); } } }