package jnpf.dmsService; import jnpf.base.ActionResult; import jnpf.dms.DmsResourceApi; import jnpf.dmsEntity.DmsWenjianBanbenEntity; import jnpf.dmsEntity.download.entity.DmsWenjianXiazaiShenqingDetailEntity; import jnpf.dmsEntity.download.entity.DmsWenjianXiazaiShenqingEntity; import jnpf.dmsEntity.permission.form.DmsPersonalFolderDownloadForm; import jnpf.dmsEntity.permission.vo.DmsPersonalFolderAddResultVO; import jnpf.dmsMapper.DmsWenjianBanbenMapper; import jnpf.dmsMapper.DmsWenjianXiazaiShenqingDetailMapper; import jnpf.dmsMapper.DmsWenjianXiazaiShenqingMapper; import jnpf.exception.DataException; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Arrays; import java.util.Collections; import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; class DmsWenjianFuzhuGuanliXiazaiServiceTest { private static final ZoneId BUSINESS_ZONE = ZoneId.of("Asia/Shanghai"); private static final UUID DOCUMENT_ID = UUID.fromString("018f0000-0000-7000-8000-000000000901"); private static final UUID FILE_VERSION_ID = UUID.fromString("018f0000-0000-7000-8000-000000000902"); @Test void authorizesEachDownloadDetailWithEndOfDayValidity() { Fixture fixture = new Fixture(); when(fixture.shenqingMapper.selectList(any())) .thenReturn(Collections.singletonList(shenqing())); when(fixture.zixiangMapper.selectList(any())) .thenReturn(Arrays.asList(zixiang("banben-1"), zixiang("banben-1"))); when(fixture.banbenMapper.selectList(any())) .thenReturn(Collections.singletonList(banben(true))); DmsPersonalFolderAddResultVO expected = new DmsPersonalFolderAddResultVO(2, 1); when(fixture.dmsResourceApi.addDownloadedFilesToPersonalFolder( eq("jnpf-flowable"), any())).thenReturn(ActionResult.success("success", expected)); LocalDate expectedValidDate = LocalDate.now(BUSINESS_ZONE).plusDays(24); DmsPersonalFolderAddResultVO result = fixture.service.xiazaiWenjianShouquan( " flow-1 ", " task-1 "); assertSame(expected, result); ArgumentCaptor formCaptor = ArgumentCaptor.forClass(DmsPersonalFolderDownloadForm.class); verify(fixture.dmsResourceApi).addDownloadedFilesToPersonalFolder( eq("jnpf-flowable"), formCaptor.capture()); DmsPersonalFolderDownloadForm form = formCaptor.getValue(); assertEquals("user-1", form.getUserId()); assertEquals(2, form.getFiles().size()); assertEquals(DOCUMENT_ID, form.getFiles().get(0).getDocumentId()); assertEquals(FILE_VERSION_ID, form.getFiles().get(0).getFileVersionId()); LocalDateTime validTo = form.getFiles().get(0).getValidTo().toInstant() .atZone(BUSINESS_ZONE).toLocalDateTime(); assertEquals(expectedValidDate.atTime(23, 59, 59), validTo); } @Test void authorizesNaValidityAsPermanent() { Fixture fixture = new Fixture(); DmsWenjianXiazaiShenqingDetailEntity detail = zixiang("banben-1"); detail.setXiazaiShixian(" NA "); when(fixture.shenqingMapper.selectList(any())) .thenReturn(Collections.singletonList(shenqing())); when(fixture.zixiangMapper.selectList(any())) .thenReturn(Collections.singletonList(detail)); when(fixture.banbenMapper.selectList(any())) .thenReturn(Collections.singletonList(banben(true))); DmsPersonalFolderAddResultVO expected = new DmsPersonalFolderAddResultVO(1, 1); when(fixture.dmsResourceApi.addDownloadedFilesToPersonalFolder( eq("jnpf-flowable"), any())).thenReturn(ActionResult.success("success", expected)); fixture.service.xiazaiWenjianShouquan("flow-1", "task-1"); ArgumentCaptor formCaptor = ArgumentCaptor.forClass(DmsPersonalFolderDownloadForm.class); verify(fixture.dmsResourceApi).addDownloadedFilesToPersonalFolder( eq("jnpf-flowable"), formCaptor.capture()); assertNull(formCaptor.getValue().getFiles().get(0).getValidTo()); } @Test void rejectsBusinessVersionWithoutFileCenterIds() { Fixture fixture = new Fixture(); when(fixture.shenqingMapper.selectList(any())) .thenReturn(Collections.singletonList(shenqing())); when(fixture.zixiangMapper.selectList(any())) .thenReturn(Collections.singletonList(zixiang("banben-1"))); when(fixture.banbenMapper.selectList(any())) .thenReturn(Collections.singletonList(banben(false))); assertThrows(DataException.class, () -> fixture.service.xiazaiWenjianShouquan("flow-1", "task-1")); } @Test void rejectsDownloadDetailWithoutTimeLimit() { Fixture fixture = new Fixture(); DmsWenjianXiazaiShenqingDetailEntity zixiang = zixiang("banben-1"); zixiang.setXiazaiShixian(" "); when(fixture.shenqingMapper.selectList(any())) .thenReturn(Collections.singletonList(shenqing())); when(fixture.zixiangMapper.selectList(any())) .thenReturn(Collections.singletonList(zixiang)); when(fixture.banbenMapper.selectList(any())) .thenReturn(Collections.singletonList(banben(true))); assertThrows(DataException.class, () -> fixture.service.xiazaiWenjianShouquan("flow-1", "task-1")); } @Test void rejectsInvalidDownloadTimeLimit() { Fixture fixture = new Fixture(); DmsWenjianXiazaiShenqingDetailEntity detail = zixiang("banben-1"); detail.setXiazaiShixian("tomorrow"); when(fixture.shenqingMapper.selectList(any())) .thenReturn(Collections.singletonList(shenqing())); when(fixture.zixiangMapper.selectList(any())) .thenReturn(Collections.singletonList(detail)); when(fixture.banbenMapper.selectList(any())) .thenReturn(Collections.singletonList(banben(true))); assertThrows(DataException.class, () -> fixture.service.xiazaiWenjianShouquan("flow-1", "task-1")); } private static DmsWenjianXiazaiShenqingEntity shenqing() { DmsWenjianXiazaiShenqingEntity entity = new DmsWenjianXiazaiShenqingEntity(); entity.setId("shenqing-1"); entity.setApplicantUserId("user-1"); return entity; } private static DmsWenjianXiazaiShenqingDetailEntity zixiang(String banbenId) { DmsWenjianXiazaiShenqingDetailEntity entity = new DmsWenjianXiazaiShenqingDetailEntity(); entity.setBanbenId(banbenId); entity.setXiazaiShixian("24"); return entity; } private static DmsWenjianBanbenEntity banben(boolean complete) { DmsWenjianBanbenEntity entity = new DmsWenjianBanbenEntity(); entity.setId("banben-1"); entity.setWenjianZhongxinBanbenId(FILE_VERSION_ID.toString()); if (complete) { entity.setWenjianZhongxinWenjianId(DOCUMENT_ID.toString()); } return entity; } private static final class Fixture { private final DmsWenjianXiazaiShenqingMapper shenqingMapper = mock(DmsWenjianXiazaiShenqingMapper.class); private final DmsWenjianXiazaiShenqingDetailMapper zixiangMapper = mock(DmsWenjianXiazaiShenqingDetailMapper.class); private final DmsWenjianBanbenMapper banbenMapper = mock(DmsWenjianBanbenMapper.class); private final DmsResourceApi dmsResourceApi = mock(DmsResourceApi.class); private final DmsWenjianFuzhuGuanliXiazaiService service = new DmsWenjianFuzhuGuanliXiazaiService( shenqingMapper, zixiangMapper, banbenMapper, dmsResourceApi); } }