package jnpf.dmsService; import jnpf.dmsEntity.DmsWenjianBanbenEntity; import jnpf.dmsEntity.DmsWenjianZiyuanEntity; import jnpf.dmsEntity.download.entity.DmsWenjianXiazaiShenqingDetailEntity; import jnpf.dmsEntity.download.entity.DmsWenjianXiazaiShenqingEntity; import jnpf.dmsEntity.download.form.DmsWorkflowDownloadAuthorizeForm; import jnpf.dmsEntity.download.vo.DmsWorkflowDownloadAuthorizationVO; import jnpf.dmsEntity.permission.entity.DmsFilePermissionEntity; import jnpf.dmsEntity.permission.entity.DmsFileVersionEntity; import jnpf.dmsMapper.DmsWenjianXiazaiShenqingDetailMapper; import jnpf.dmsMapper.DmsWenjianXiazaiShenqingMapper; import jnpf.exception.DataException; import jnpf.flowable.WorkFlowApi; import jnpf.flowable.entity.TaskEntity; import jnpf.flowable.enums.TaskStatusEnum; import org.junit.jupiter.api.Test; import java.util.Collections; import java.util.UUID; 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.eq; 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 DmsWorkflowDownloadAuthorizationServiceTest { private static final String TENANT_ID = "tenant-1"; private static final String FLOW_ID = "flow-1"; private static final String TASK_ID = "task-1"; private static final String REQUEST_ID = "request-1"; private static final String DETAIL_ID = "detail-1"; private static final String APPLICANT_ID = "user-1"; private static final UUID DOCUMENT_ID = UUID.fromString("018f0000-0000-7000-8000-000000000801"); private static final UUID FILE_VERSION_ID = UUID.fromString("018f0000-0000-7000-8000-000000000802"); private static final UUID PERMISSION_ID = UUID.fromString("018f0000-0000-7000-8000-000000000803"); @Test void grantsSingleUseDownloadForApprovedRequestApplicant() { Fixture fixture = new Fixture(); DmsWorkflowDownloadAuthorizeForm form = form(); when(fixture.workFlowApi.getInfoSubmit(TASK_ID)).thenReturn(passedTask()); when(fixture.requestMapper.selectByFlowForUpdate(TENANT_ID, FLOW_ID, TASK_ID)) .thenReturn(Collections.singletonList(request())); when(fixture.detailMapper.selectByRequestForUpdate(TENANT_ID, REQUEST_ID)) .thenReturn(Collections.singletonList(detail())); when(fixture.fileResolutionService.resolve(TENANT_ID, DETAIL_ID, "number-detail-1", "QM-001", "质量手册", null)).thenReturn( new DmsWorkflowFileResolutionService.ResolvedFile( businessFile(), businessVersion(), fileVersion())); DmsFilePermissionEntity permission = new DmsFilePermissionEntity(); permission.setId(PERMISSION_ID); permission.setResourceId(FILE_VERSION_ID); when(fixture.permissionGrantService.ensureWorkflowDownloadPermissions( eq(TENANT_ID), eq("download-request:" + REQUEST_ID + ":" + DETAIL_ID), eq(APPLICANT_ID), eq(Collections.singletonList(FILE_VERSION_ID)), eq(DmsDownloadDeadline.resolve("1", DETAIL_ID)), eq("jnpf-file"), any())) .thenReturn(Collections.singletonList(permission)); DmsWorkflowDownloadAuthorizationVO result = fixture.service.authorize( TENANT_ID, form, "jnpf-file"); assertTrue(result.getCompleted()); assertEquals(APPLICANT_ID, result.getApplicantUserId()); assertEquals(1, result.getFiles().size()); assertEquals(FILE_VERSION_ID, result.getFiles().get(0).getFileVersionId()); assertEquals(PERMISSION_ID, result.getFiles().get(0).getPermissionId()); assertEquals(Boolean.FALSE, result.getFiles().get(0).getPermanent()); } @Test void rejectsTaskThatHasNotPassedBeforeReadingApplication() { Fixture fixture = new Fixture(); TaskEntity running = passedTask(); running.setStatus(TaskStatusEnum.RUNNING.getCode()); when(fixture.workFlowApi.getInfoSubmit(TASK_ID)).thenReturn(running); DataException exception = assertThrows(DataException.class, () -> fixture.service.authorize(TENANT_ID, form(), "jnpf-file")); assertEquals("流程任务尚未审核通过,不能授予下载权限", exception.getMessage()); verify(fixture.requestMapper, never()).selectByFlowForUpdate(any(), any(), any()); } private static DmsWorkflowDownloadAuthorizeForm form() { DmsWorkflowDownloadAuthorizeForm form = new DmsWorkflowDownloadAuthorizeForm(); form.setSourceId(FLOW_ID); form.setTaskId(TASK_ID); return form; } private static TaskEntity passedTask() { TaskEntity task = new TaskEntity(); task.setId(TASK_ID); task.setFlowId(FLOW_ID); task.setStatus(TaskStatusEnum.PASSED.getCode()); return task; } private static DmsWenjianXiazaiShenqingEntity request() { DmsWenjianXiazaiShenqingEntity request = new DmsWenjianXiazaiShenqingEntity(); request.setId(REQUEST_ID); request.setApplicantUserId(APPLICANT_ID); request.setFlowState(TaskStatusEnum.PASSED.getCode()); request.setBizSign("request-sign-1"); return request; } private static DmsWenjianXiazaiShenqingDetailEntity detail() { DmsWenjianXiazaiShenqingDetailEntity detail = new DmsWenjianXiazaiShenqingDetailEntity(); detail.setId(DETAIL_ID); detail.setXiazaiShixian("1"); detail.setFileReferenceId("number-detail-1"); detail.setFileNumber("QM-001"); detail.setFileName("质量手册"); return detail; } private static DmsWenjianZiyuanEntity businessFile() { DmsWenjianZiyuanEntity file = new DmsWenjianZiyuanEntity(); file.setId("business-file-1"); file.setWenjianBianhao("QM-001"); file.setWenjianMingcheng("质量手册"); file.setDangqianBanbenId("business-version-1"); file.setWenjianZhongxinWenjianId(DOCUMENT_ID.toString()); return file; } private static DmsWenjianBanbenEntity businessVersion() { DmsWenjianBanbenEntity version = new DmsWenjianBanbenEntity(); version.setId("business-version-1"); version.setWenjianId("business-file-1"); version.setWenjianZhongxinBanbenId(FILE_VERSION_ID.toString()); return version; } private static DmsFileVersionEntity fileVersion() { DmsFileVersionEntity version = new DmsFileVersionEntity(); version.setId(FILE_VERSION_ID); version.setDocumentId(DOCUMENT_ID); version.setFileName("quality-manual.docx"); version.setMimeType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); version.setSizeBytes(2048L); return version; } private static final class Fixture { private final WorkFlowApi workFlowApi = mock(WorkFlowApi.class); private final DmsWenjianXiazaiShenqingMapper requestMapper = mock(DmsWenjianXiazaiShenqingMapper.class); private final DmsWenjianXiazaiShenqingDetailMapper detailMapper = mock(DmsWenjianXiazaiShenqingDetailMapper.class); private final DmsWorkflowFileResolutionService fileResolutionService = mock(DmsWorkflowFileResolutionService.class); private final DmsPermissionGrantService permissionGrantService = mock(DmsPermissionGrantService.class); private final DmsWorkflowDownloadAuthorizationService service = new DmsWorkflowDownloadAuthorizationService(workFlowApi, requestMapper, detailMapper, fileResolutionService, permissionGrantService); } }