package jnpf.dmsService; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import jnpf.dmsEntity.DmsDanganCundangShenqingEntity; import jnpf.dmsEntity.DmsDanganCundangShenqingDanganheEntity; import jnpf.dmsEntity.form.DmsDanganCundangJieshouDanganheForm; import jnpf.dmsEntity.form.DmsDanganCundangJieshouForm; import jnpf.dmsMapper.DmsDanganCundangShenqingDanganheMapper; import jnpf.dmsMapper.DmsDanganCundangShenqingMapper; import jnpf.dmsService.impl.DmsDanganCundangJieshouServiceImpl; import jnpf.exception.DataException; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.BeforeEach; import org.mockito.ArgumentCaptor; import org.apache.ibatis.builder.MapperBuilderAssistant; import org.apache.ibatis.session.Configuration; import java.util.Arrays; import java.util.Date; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; 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 DmsDanganCundangJieshouServiceTest { @BeforeEach void setUp() { if (TableInfoHelper.getTableInfo(DmsDanganCundangShenqingDanganheEntity.class) == null) { TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new Configuration(), ""), DmsDanganCundangShenqingDanganheEntity.class); } if (TableInfoHelper.getTableInfo(DmsDanganCundangShenqingEntity.class) == null) { TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new Configuration(), ""), DmsDanganCundangShenqingEntity.class); } } @Test void receivesEveryRequestedDanganheInOneConditionalUpdate() throws Exception { DmsDanganCundangShenqingDanganheMapper mapper = mock(DmsDanganCundangShenqingDanganheMapper.class); when(mapper.selectList(any())).thenReturn(Arrays.asList(danganhe("box-1", null), danganhe("box-2", ""))); when(mapper.update(isNull(), any())).thenReturn(2); DmsDanganCundangJieshouService service = service(mapper); service.jieshou(form(item("box-1", "box-1"), item("box-2", "box-2"))); ArgumentCaptor> captor = ArgumentCaptor.forClass(Wrapper.class); verify(mapper).update(isNull(), captor.capture()); com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper update = (com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper) captor.getValue(); String sqlSet = update.getSqlSet(); assertTrue(sqlSet.contains("jieshou_ren")); assertTrue(sqlSet.contains("yijiao_ren")); assertTrue(sqlSet.contains("biz_sign")); assertTrue(sqlSet.contains("biz_review_sign")); assertTrue(sqlSet.contains("jieshou_riqi")); assertTrue(update.getParamNameValuePairs().containsValue("receiver-1")); assertTrue(update.getParamNameValuePairs().containsValue("reviewer-1")); assertTrue(update.getParamNameValuePairs().containsValue("sign-1")); assertTrue(update.getParamNameValuePairs().containsValue("review-sign-1")); assertNotNull(update.getParamNameValuePairs().values().stream() .filter(Date.class::isInstance) .findFirst() .orElse(null)); } @Test void rejectsWhenAnyDanganheHasAlreadyBeenReceived() { DmsDanganCundangShenqingDanganheMapper mapper = mock(DmsDanganCundangShenqingDanganheMapper.class); when(mapper.selectList(any())).thenReturn(Arrays.asList(danganhe("box-1", null), danganhe("box-2", "receiver-0"))); DmsDanganCundangJieshouService service = service(mapper); DataException error = assertThrows(DataException.class, () -> service.jieshou(form(item("box-1", "box-1"), item("box-2", "box-2")))); assertEquals("档案盒已接收,不能重复接收", error.getMessage()); verify(mapper, never()).update(any(), any()); } @Test void rollsBackWhenAnotherRequestReceivesARecordBeforeTheUpdate() { DmsDanganCundangShenqingDanganheMapper mapper = mock(DmsDanganCundangShenqingDanganheMapper.class); when(mapper.selectList(any())).thenReturn(Arrays.asList(danganhe("box-1", null), danganhe("box-2", null))); when(mapper.update(isNull(), any())).thenReturn(1); DmsDanganCundangJieshouService service = service(mapper); DataException error = assertThrows(DataException.class, () -> service.jieshou(form(item("box-1", "box-1"), item("box-2", "box-2")))); assertEquals("档案盒已接收,不能重复接收", error.getMessage()); } @Test void checkSucceedsForAnApprovedUnreceivedDanganhe() throws Exception { DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class); DmsDanganCundangShenqingMapper shenqingMapper = mock(DmsDanganCundangShenqingMapper.class); when(danganheMapper.selectList(any())).thenReturn(Arrays.asList(danganhe("box-1", null, "shenqing-1"))); when(shenqingMapper.selectOne(any())).thenReturn(shenqing("shenqing-1", 2)); DmsDanganCundangJieshouService service = new DmsDanganCundangJieshouServiceImpl( danganheMapper, shenqingMapper); DmsDanganCundangShenqingDanganheEntity result = service.check("box-1"); assertEquals("box-1", result.getId()); verify(danganheMapper).selectList(any()); verify(shenqingMapper).selectOne(any()); } @Test void checkRejectsUnknownDanganheBeforeCheckingApplication() { DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class); DmsDanganCundangShenqingMapper shenqingMapper = mock(DmsDanganCundangShenqingMapper.class); when(danganheMapper.selectList(any())).thenReturn(Arrays.asList()); DmsDanganCundangJieshouService service = new DmsDanganCundangJieshouServiceImpl( danganheMapper, shenqingMapper); DataException error = assertThrows(DataException.class, () -> service.check("missing-box")); assertEquals("未找到对应的档案盒记录", error.getMessage()); verify(shenqingMapper, never()).selectOne(any()); } @Test void checkRejectsApplicationThatHasNotPassed() { DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class); DmsDanganCundangShenqingMapper shenqingMapper = mock(DmsDanganCundangShenqingMapper.class); when(danganheMapper.selectList(any())).thenReturn(Arrays.asList(danganhe("box-1", null, "shenqing-1"))); when(shenqingMapper.selectOne(any())).thenReturn(shenqing("shenqing-1", 1)); DmsDanganCundangJieshouService service = new DmsDanganCundangJieshouServiceImpl( danganheMapper, shenqingMapper); DataException error = assertThrows(DataException.class, () -> service.check("box-1")); assertEquals("档案存档申请尚未审批通过,无法接收", error.getMessage()); } @Test void checkRejectsDanganheThatHasAlreadyBeenReceived() { DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class); DmsDanganCundangShenqingMapper shenqingMapper = mock(DmsDanganCundangShenqingMapper.class); when(danganheMapper.selectList(any())).thenReturn(Arrays.asList(danganhe("box-1", "receiver-0", "shenqing-1"))); when(shenqingMapper.selectOne(any())).thenReturn(shenqing("shenqing-1", 2)); DmsDanganCundangJieshouService service = new DmsDanganCundangJieshouServiceImpl( danganheMapper, shenqingMapper); DataException error = assertThrows(DataException.class, () -> service.check("box-1")); assertEquals("档案盒已接收,不能重复接收", error.getMessage()); } private DmsDanganCundangJieshouService service(DmsDanganCundangShenqingDanganheMapper danganheMapper) { return new DmsDanganCundangJieshouServiceImpl(danganheMapper, mock(DmsDanganCundangShenqingMapper.class)); } private DmsDanganCundangJieshouForm form(DmsDanganCundangJieshouDanganheForm... danganhe) { DmsDanganCundangJieshouForm form = new DmsDanganCundangJieshouForm(); form.setDanganheXinxi(Arrays.asList(danganhe)); form.setBizUserId("receiver-1"); form.setBizReviewUser("reviewer-1"); form.setBizSign("sign-1"); form.setBizReviewSign("review-sign-1"); return form; } private DmsDanganCundangJieshouDanganheForm item(String id, String fId) { DmsDanganCundangJieshouDanganheForm item = new DmsDanganCundangJieshouDanganheForm(); item.setId(id); item.setFId(fId); return item; } private DmsDanganCundangShenqingDanganheEntity danganhe(String id, String jieshouRen) { return danganhe(id, jieshouRen, null); } private DmsDanganCundangShenqingDanganheEntity danganhe(String id, String jieshouRen, String foreignId) { DmsDanganCundangShenqingDanganheEntity result = new DmsDanganCundangShenqingDanganheEntity(); result.setId(id); result.setJieshouRen(jieshouRen); result.setForeignId(foreignId); result.setJieshouRiqi(new Date()); return result; } private DmsDanganCundangShenqingEntity shenqing(String id, Integer flowState) { DmsDanganCundangShenqingEntity result = new DmsDanganCundangShenqingEntity(); result.setId(id); result.setFlowState(flowState); return result; } }