package jnpf.dmsService; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import jnpf.dmsEntity.DmsDanganCundangShenqingDanganheEntity; import jnpf.dmsEntity.DmsDanganXiaohuiShenqingEntity; import jnpf.dmsEntity.DmsDanganXiaohuiShenqingZixiangEntity; import jnpf.dmsMapper.DmsDanganCundangShenqingDanganheMapper; import jnpf.dmsMapper.DmsDanganXiaohuiShenqingMapper; import jnpf.dmsMapper.DmsDanganXiaohuiShenqingZixiangMapper; import jnpf.dmsService.impl.DmsDanganXiaohuiShenqingTongguoServiceImpl; 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 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 DmsDanganXiaohuiShenqingTongguoServiceTest { @BeforeEach void setUp() { initialize(DmsDanganXiaohuiShenqingEntity.class); initialize(DmsDanganXiaohuiShenqingZixiangEntity.class); initialize(DmsDanganCundangShenqingDanganheEntity.class); } @Test void assignsEverySelectedDanganheToTheApprovedApplication() throws Exception { DmsDanganXiaohuiShenqingMapper shenqingMapper = mock(DmsDanganXiaohuiShenqingMapper.class); DmsDanganXiaohuiShenqingZixiangMapper zixiangMapper = mock(DmsDanganXiaohuiShenqingZixiangMapper.class); DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class); when(shenqingMapper.selectList(any())).thenReturn(Arrays.asList(application("destroy-1"))); when(zixiangMapper.selectList(any())).thenReturn(Arrays.asList(detail("box-1"), detail("box-2"))); when(danganheMapper.selectList(any())).thenReturn(Arrays.asList(sourceBox("box-1", null), sourceBox("box-2", ""))); when(danganheMapper.update(isNull(), any())).thenReturn(2); service(shenqingMapper, zixiangMapper, danganheMapper).tongguo("flow-1", "task-1"); ArgumentCaptor> captor = ArgumentCaptor.forClass(Wrapper.class); verify(danganheMapper).update(isNull(), captor.capture()); com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper update = (com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper) captor.getValue(); assertTrue(update.getSqlSet().contains("xiaohui_id")); assertTrue(update.getParamNameValuePairs().containsValue("destroy-1")); } @Test void allowsAnIdempotentApprovalForTheSameApplication() throws Exception { DmsDanganXiaohuiShenqingMapper shenqingMapper = mock(DmsDanganXiaohuiShenqingMapper.class); DmsDanganXiaohuiShenqingZixiangMapper zixiangMapper = mock(DmsDanganXiaohuiShenqingZixiangMapper.class); DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class); when(shenqingMapper.selectList(any())).thenReturn(Arrays.asList(application("destroy-1"))); when(zixiangMapper.selectList(any())).thenReturn(Arrays.asList(detail("box-1"))); when(danganheMapper.selectList(any())).thenReturn(Arrays.asList(sourceBox("box-1", "destroy-1"))); when(danganheMapper.update(isNull(), any())).thenReturn(1); service(shenqingMapper, zixiangMapper, danganheMapper).tongguo("flow-1", "task-1"); verify(danganheMapper).update(isNull(), any()); } @Test void rejectsDanganheAssignedToAnotherDestructionApplication() { DmsDanganXiaohuiShenqingMapper shenqingMapper = mock(DmsDanganXiaohuiShenqingMapper.class); DmsDanganXiaohuiShenqingZixiangMapper zixiangMapper = mock(DmsDanganXiaohuiShenqingZixiangMapper.class); DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class); when(shenqingMapper.selectList(any())).thenReturn(Arrays.asList(application("destroy-1"))); when(zixiangMapper.selectList(any())).thenReturn(Arrays.asList(detail("box-1"))); when(danganheMapper.selectList(any())).thenReturn(Arrays.asList(sourceBox("box-1", "destroy-other"))); DataException error = assertThrows(DataException.class, () -> service(shenqingMapper, zixiangMapper, danganheMapper).tongguo("flow-1", "task-1")); assertEquals("档案盒已关联其他销毁申请,无法重复通过", error.getMessage()); verify(danganheMapper, never()).update(any(), any()); } @Test void rejectsBlankDanganheIdBeforeUpdatingAnything() { DmsDanganXiaohuiShenqingMapper shenqingMapper = mock(DmsDanganXiaohuiShenqingMapper.class); DmsDanganXiaohuiShenqingZixiangMapper zixiangMapper = mock(DmsDanganXiaohuiShenqingZixiangMapper.class); DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class); when(shenqingMapper.selectList(any())).thenReturn(Arrays.asList(application("destroy-1"))); when(zixiangMapper.selectList(any())).thenReturn(Arrays.asList(detail(" "))); DataException error = assertThrows(DataException.class, () -> service(shenqingMapper, zixiangMapper, danganheMapper).tongguo("flow-1", "task-1")); assertEquals("档案销毁申请明细缺少档案盒ID(danganhe_id)", error.getMessage()); verify(danganheMapper, never()).selectList(any()); verify(danganheMapper, never()).update(any(), any()); } private void initialize(Class entityClass) { if (TableInfoHelper.getTableInfo(entityClass) == null) { TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new Configuration(), ""), entityClass); } } private DmsDanganXiaohuiShenqingTongguoService service( DmsDanganXiaohuiShenqingMapper shenqingMapper, DmsDanganXiaohuiShenqingZixiangMapper zixiangMapper, DmsDanganCundangShenqingDanganheMapper danganheMapper) { return new DmsDanganXiaohuiShenqingTongguoServiceImpl(shenqingMapper, zixiangMapper, danganheMapper); } private DmsDanganXiaohuiShenqingEntity application(String id) { DmsDanganXiaohuiShenqingEntity application = new DmsDanganXiaohuiShenqingEntity(); application.setId(id); application.setFlowId("flow-1"); application.setFlowTaskId("task-1"); return application; } private DmsDanganXiaohuiShenqingZixiangEntity detail(String danganheId) { DmsDanganXiaohuiShenqingZixiangEntity detail = new DmsDanganXiaohuiShenqingZixiangEntity(); detail.setDanganheId(danganheId); return detail; } private DmsDanganCundangShenqingDanganheEntity sourceBox(String id, String xiaohuiId) { DmsDanganCundangShenqingDanganheEntity danganhe = new DmsDanganCundangShenqingDanganheEntity(); danganhe.setId(id); danganhe.setXiaohuiId(xiaohuiId); return danganhe; } }